When I use pandas read_csv to read a column with a timezone aware datetime (and specify this column to be the index), pandas converts it to a timezone naive utc
The answer of Alex leads to a timezone aware DatetimeIndex. To get a timezone naive local DatetimeIndex, as asked by the OP, inform dateutil.parser.parser
to ignore the timezone information by setting ignoretz=True
:
import dateutil
date_parser = lambda x: dateutil.parser.parse(x, ignoretz=True)
df = pd.read_csv('Test.csv', index_col=0, parse_dates=True, date_parser=date_parser)
print(df)
outputs
Temperature
DateTime
2016-07-01 11:05:07 21.125
2016-07-01 11:05:09 21.138
2016-07-01 11:05:10 21.156
2016-07-01 11:05:11 21.179
2016-07-01 11:05:12 21.198
2016-07-01 11:05:13 21.206
2016-07-01 11:05:14 21.225
2016-07-01 11:05:15 21.233
According to the docs the default date_parser
uses dateutil.parser.parser
. According to the docs for that function, the default is to ignore timezones. So if you supply dateutil.parser.parser
as the date_parser
kwarg, timezones are not converted.
import dateutil
df = pd.read_csv('Test.csv', index_col=0, parse_dates=True, date_parser=dateutil.parser.parse)
print(df)
outputs
Temperature
DateTime
2016-07-01 11:05:07+02:00 21.125
2016-07-01 11:05:09+02:00 21.138
2016-07-01 11:05:10+02:00 21.156
2016-07-01 11:05:11+02:00 21.179
2016-07-01 11:05:12+02:00 21.198
2016-07-01 11:05:13+02:00 21.206
2016-07-01 11:05:14+02:00 21.225
2016-07-01 11:05:15+02:00 21.233
I adopted the dateutil
technique earlier today but have since switched to a faster alternative:
date_parser = lambda ts: pd.to_datetime([s[:-5] for s in ts]))
Edit:
s[:-5]
is correct (screenshot has error)
In the screenshot below, I import ~55MB of tab-separated files. The dateutil
method works, but takes orders of magnitude longer.
This was using pandas 0.18.1 and dateutil 2.5.3.
EDIT This lambda function will work even if Z-0000
suffix is missing...
date_parser = lambda ts: pd.to_datetime([s[:-5] if 'Z' in s else s for s in ts])
You can even try :
date_parser = lambda x : pd.to_datetime(x.str[:-6])