Skip to content

Commit b56db29

Browse files
committed
Merge pull request #4167 from jreback/dt_format
TST: to_datetime format tests
2 parents 9be629e + f73e38d commit b56db29

File tree

2 files changed

+55
-37
lines changed

2 files changed

+55
-37
lines changed

pandas/tseries/tests/test_timeseries.py

+33-10
Original file line numberDiff line numberDiff line change
@@ -793,17 +793,40 @@ def test_to_datetime_default(self):
793793
xp = datetime(2001, 1, 1)
794794
self.assert_(rs, xp)
795795

796+
def test_dayfirst(self):
797+
798+
# GH 3341
799+
result = to_datetime('13-01-2012', dayfirst=True)
800+
expected = Timestamp('20120113')
801+
self.assert_(result == expected)
802+
803+
#### dayfirst is essentially broken
804+
#### to_datetime('01-13-2012', dayfirst=True)
805+
#### self.assertRaises(ValueError, to_datetime('01-13-2012', dayfirst=True))
806+
796807
def test_to_datetime_format(self):
797808
values = ['1/1/2000', '1/2/2000', '1/3/2000']
798809

799-
def _parse_format(fmt, values):
800-
return to_datetime([datetime.strptime(x, fmt)
801-
for x in values])
802-
803-
for fmt in ['%d/%m/%Y', '%m/%d/%Y']:
804-
result = to_datetime(values, format=fmt)
805-
expected = _parse_format(fmt, values)
806-
self.assert_(result.equals(expected))
810+
results1 = [ Timestamp('20000101'), Timestamp('20000201'),
811+
Timestamp('20000301') ]
812+
results2 = [ Timestamp('20000101'), Timestamp('20000102'),
813+
Timestamp('20000103') ]
814+
for vals, expecteds in [ (values, (Index(results1), Index(results2))),
815+
(Series(values),(Series(results1), Series(results2))),
816+
(values[0], (results1[0], results2[0])),
817+
(values[1], (results1[1], results2[1])),
818+
(values[2], (results1[2], results2[2])) ]:
819+
820+
for i, fmt in enumerate(['%d/%m/%Y', '%m/%d/%Y']):
821+
result = to_datetime(vals, format=fmt)
822+
expected = expecteds[i]
823+
824+
if isinstance(expected, Series):
825+
assert_series_equal(result, Series(expected))
826+
elif isinstance(expected, Timestamp):
827+
self.assert_(result == expected)
828+
else:
829+
self.assert_(result.equals(expected))
807830

808831
def test_to_datetime_format_microsecond(self):
809832
val = '01-Apr-2011 00:00:01.978'
@@ -2812,10 +2835,10 @@ def check(val,unit=None,h=1,s=1,us=0):
28122835
# nan
28132836
result = Timestamp(np.nan)
28142837
self.assert_(result is NaT)
2815-
2838+
28162839
result = Timestamp(None)
28172840
self.assert_(result is NaT)
2818-
2841+
28192842
result = Timestamp(iNaT)
28202843
self.assert_(result is NaT)
28212844

pandas/tseries/tools.py

+22-27
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,26 @@ def to_datetime(arg, errors='ignore', dayfirst=False, utc=None, box=True,
7676
-------
7777
ret : datetime if parsing succeeded
7878
"""
79+
from pandas import Timestamp
7980
from pandas.core.series import Series
8081
from pandas.tseries.index import DatetimeIndex
8182

82-
def _convert_f(arg):
83-
arg = com._ensure_object(arg)
83+
def _convert_listlike(arg, box):
84+
85+
if isinstance(arg, (list,tuple)):
86+
arg = np.array(arg, dtype='O')
8487

88+
if com.is_datetime64_dtype(arg):
89+
if box and not isinstance(arg, DatetimeIndex):
90+
try:
91+
return DatetimeIndex(arg, tz='utc' if utc else None)
92+
except ValueError, e:
93+
values, tz = tslib.datetime_to_datetime64(arg)
94+
return DatetimeIndex._simple_new(values, None, tz=tz)
95+
96+
return arg
97+
98+
arg = com._ensure_object(arg)
8599
try:
86100
if format is not None:
87101
result = tslib.array_strptime(arg, format)
@@ -92,44 +106,25 @@ def _convert_f(arg):
92106
if com.is_datetime64_dtype(result) and box:
93107
result = DatetimeIndex(result, tz='utc' if utc else None)
94108
return result
109+
95110
except ValueError, e:
96111
try:
97112
values, tz = tslib.datetime_to_datetime64(arg)
98113
return DatetimeIndex._simple_new(values, None, tz=tz)
99114
except (ValueError, TypeError):
100115
raise e
101116

102-
def _convert_listlike(arg):
103-
if isinstance(arg, list):
104-
arg = np.array(arg, dtype='O')
105-
106-
if com.is_datetime64_dtype(arg):
107-
if box and not isinstance(arg, DatetimeIndex):
108-
try:
109-
return DatetimeIndex(arg, tz='utc' if utc else None)
110-
except ValueError, e:
111-
try:
112-
values, tz = tslib.datetime_to_datetime64(arg)
113-
return DatetimeIndex._simple_new(values, None, tz=tz)
114-
except (ValueError, TypeError):
115-
raise e
116-
return arg
117-
118-
return _convert_f(arg)
119-
120117
if arg is None:
121118
return arg
122-
elif isinstance(arg, datetime):
119+
elif isinstance(arg, Timestamp):
123120
return arg
124121
elif isinstance(arg, Series):
125-
values = arg.values
126-
if not com.is_datetime64_dtype(values):
127-
values = _convert_f(values)
122+
values = _convert_listlike(arg.values, box=False)
128123
return Series(values, index=arg.index, name=arg.name)
129-
elif isinstance(arg, (np.ndarray, list)):
130-
return _convert_listlike(arg)
124+
elif com.is_list_like(arg):
125+
return _convert_listlike(arg, box=box)
131126

132-
return _convert_listlike(np.array([ arg ], dtype='O'))[0]
127+
return _convert_listlike(np.array([ arg ]), box=box)[0]
133128

134129
class DateParseError(ValueError):
135130
pass

0 commit comments

Comments
 (0)