@@ -263,6 +263,17 @@ cdef inline bint does_string_look_like_time(str parse_string):
263
263
264
264
return 0 <= hour <= 23 and 0 <= minute <= 59
265
265
266
+ from pandas.util._exceptions import find_stack_level
267
+
268
+
269
+ def du_parse_with_warning (*args , **kwargs ):
270
+ parsed = du_parse(* args, ** kwargs)
271
+ warnings.warn(
272
+ " Parsing datetime strings without a format specified, "
273
+ " please specify a format to avoid unexpected results" ,
274
+ stacklevel = find_stack_level(),
275
+ )
276
+
266
277
267
278
def parse_datetime_string (
268
279
# NB: This will break with np.str_ (GH#32264) even though
@@ -290,8 +301,12 @@ def parse_datetime_string(
290
301
291
302
if does_string_look_like_time(date_string):
292
303
# use current datetime as default, not pass _DEFAULT_DATETIME
293
- dt = du_parse(date_string, dayfirst = dayfirst,
294
- yearfirst = yearfirst, ** kwargs)
304
+ dt = du_parse_with_warning(
305
+ date_string,
306
+ dayfirst = dayfirst,
307
+ yearfirst = yearfirst,
308
+ ** kwargs,
309
+ )
295
310
return dt
296
311
297
312
dt, _ = _parse_delimited_date(date_string, dayfirst)
@@ -307,8 +322,13 @@ def parse_datetime_string(
307
322
pass
308
323
309
324
try :
310
- dt = du_parse(date_string, default = _DEFAULT_DATETIME,
311
- dayfirst = dayfirst, yearfirst = yearfirst, ** kwargs)
325
+ dt = du_parse_with_warning(
326
+ date_string,
327
+ default = _DEFAULT_DATETIME,
328
+ dayfirst = dayfirst,
329
+ yearfirst = yearfirst,
330
+ ** kwargs,
331
+ )
312
332
except TypeError :
313
333
# following may be raised from dateutil
314
334
# TypeError: 'NoneType' object is not iterable
@@ -706,7 +726,11 @@ def try_parse_dates(
706
726
date = datetime.now()
707
727
default = datetime(date.year, date.month, 1 )
708
728
709
- parse_date = lambda x : du_parse(x, dayfirst = dayfirst, default = default)
729
+ parse_date = lambda x : du_parse_with_warning(
730
+ x,
731
+ dayfirst = dayfirst,
732
+ default = default,
733
+ )
710
734
711
735
# EAFP here
712
736
try:
@@ -753,13 +777,17 @@ def try_parse_date_and_time(
753
777
date = datetime.now()
754
778
default = datetime(date.year, date.month, 1 )
755
779
756
- parse_date = lambda x : du_parse(x, dayfirst = dayfirst, default = default)
780
+ parse_date = lambda x : du_parse_with_warning(
781
+ x,
782
+ dayfirst = dayfirst,
783
+ default = default,
784
+ )
757
785
758
786
else :
759
787
parse_date = date_parser
760
788
761
789
if time_parser is None :
762
- parse_time = lambda x : du_parse (x)
790
+ parse_time = lambda x : du_parse_with_warning (x)
763
791
764
792
else :
765
793
parse_time = time_parser
@@ -980,7 +1008,7 @@ def guess_datetime_format(dt_str, bint dayfirst=False):
980
1008
datetime_attrs_to_format.insert(0 , day_attribute_and_format)
981
1009
982
1010
try :
983
- parsed_datetime = du_parse (dt_str, dayfirst = dayfirst)
1011
+ parsed_datetime = du_parse_with_warning (dt_str, dayfirst = dayfirst)
984
1012
except (ValueError , OverflowError ):
985
1013
# In case the datetime can't be parsed, its format cannot be guessed
986
1014
return None
0 commit comments