Skip to content

Commit f41f4d4

Browse files
committed
run output of date parsers through to_datetime to coerce into acceptable
type (#10245)
1 parent 342c91b commit f41f4d4

File tree

3 files changed

+34
-6
lines changed

3 files changed

+34
-6
lines changed

doc/source/whatsnew/v0.16.2.txt

+1
Original file line numberDiff line numberDiff line change
@@ -152,3 +152,4 @@ Bug Fixes
152152

153153
- Bug to handle masking empty ``DataFrame``(:issue:`10126`)
154154
- Bug where MySQL interface could not handle numeric table/column names (:issue:`10255`)
155+
- Bug where ``read_csv`` and similar failed if making ``MultiIndex`` and ``date_parser`` returned ``datetime64`` array of other time resolution than ``[ns]``.

pandas/io/parsers.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -2057,18 +2057,20 @@ def converter(*date_cols):
20572057
infer_datetime_format=infer_datetime_format
20582058
)
20592059
except:
2060-
return lib.try_parse_dates(strs, dayfirst=dayfirst)
2060+
return tools.to_datetime(
2061+
lib.try_parse_dates(strs, dayfirst=dayfirst))
20612062
else:
20622063
try:
2063-
result = date_parser(*date_cols)
2064+
result = tools.to_datetime(date_parser(*date_cols))
20642065
if isinstance(result, datetime.datetime):
20652066
raise Exception('scalar parser')
20662067
return result
20672068
except Exception:
20682069
try:
2069-
return lib.try_parse_dates(_concat_date_cols(date_cols),
2070-
parser=date_parser,
2071-
dayfirst=dayfirst)
2070+
return tools.to_datetime(
2071+
lib.try_parse_dates(_concat_date_cols(date_cols),
2072+
parser=date_parser,
2073+
dayfirst=dayfirst))
20722074
except Exception:
20732075
return generic_parser(date_parser, *date_cols)
20742076

pandas/io/tests/test_date_converters.py

+26-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import numpy as np
1212
from numpy.testing.decorators import slow
1313

14-
from pandas import DataFrame, Series, Index, isnull
14+
from pandas import DataFrame, Series, Index, MultiIndex, isnull
1515
import pandas.io.parsers as parsers
1616
from pandas.io.parsers import (read_csv, read_table, read_fwf,
1717
TextParser)
@@ -119,6 +119,31 @@ def test_generic(self):
119119
self.assertIn('ym', df)
120120
self.assertEqual(df.ym.ix[0], date(2001, 1, 1))
121121

122+
def test_dateparser_resolution_if_not_ns(self):
123+
# issue 10245
124+
data = """\
125+
date,time,prn,rxstatus
126+
2013-11-03,19:00:00,126,00E80000
127+
2013-11-03,19:00:00,23,00E80000
128+
2013-11-03,19:00:00,13,00E80000
129+
"""
130+
131+
def date_parser(date, time):
132+
datetime = np.array(date + 'T' + time + 'Z', dtype='datetime64[s]')
133+
return datetime
134+
135+
df = read_csv(StringIO(data), date_parser=date_parser,
136+
parse_dates={'datetime': ['date', 'time']},
137+
index_col=['datetime', 'prn'])
138+
139+
datetimes = np.array(['2013-11-03T19:00:00Z']*3, dtype='datetime64[s]')
140+
df_correct = DataFrame(data={'rxstatus': ['00E80000']*3},
141+
index=MultiIndex.from_tuples(
142+
[(datetimes[0], 126),
143+
(datetimes[1], 23),
144+
(datetimes[2], 13)],
145+
names=['datetime', 'prn']))
146+
assert_frame_equal(df, df_correct)
122147

123148
if __name__ == '__main__':
124149
import nose

0 commit comments

Comments
 (0)