我正在使用Pandas来读取和处理csv文件。我的csv文件有日期/时间列,如下所示:
11:59:50:322 02 10 2015 -0400 EDT
11:11:55:051 16 10 2015 -0400 EDT
00:38:37:106 02 11 2015 -0500 EST
04:15:51:600 14 11 2015 -0500 EST
04:15:51:600 14 11 2015 -0500 EST
13:43:28:540 28 11 2015 -0500 EST
09:24:12:723 14 12 2015 -0500 EST
13:28:12:346 28 12 2015 -0500 EST
我如何使用python / pandas读取这个内容,到目前为止我所拥有的是:
pd.to_datetime(pd.Series(df['senseStartTime']),format='%H:%M:%S:%f %d %m %Y %z %Z')
但这不起作用,虽然之前我能够将相同的代码用于另一种格式(使用不同的格式说明符)。有什么建议吗?
答案 0 :(得分:1)
你遇到的问题可能是因为3.2之前的Python版本(我认为?)在时区上遇到了很多麻烦,所以你的格式字符串可能会搞砸%z和%Z部分。例如,在Python 2.7中:
In [187]: import datetime
In [188]: datetime.datetime.strptime('11:59:50:322 02 10 2015 -0400 EDT', '%H:%M:%S:%f %d %m %Y %z %Z')
ValueError: 'z' is a bad directive in format '%H:%M:%S:%f %d %m %Y %z %Z'
您使用的是pd.to_datetime而不是datetime.datetime.strptime,但基本问题是相同的,您可以参考this thread寻求帮助。我建议的不是使用pd.to_datetime,而是执行类似
的操作In [191]: import dateutil
In [192]: dateutil.parser.parse('11:59:50.322 02 10 2015 -0400')
Out[192]: datetime.datetime(2015, 2, 10, 11, 59, 50, 322000, tzinfo=tzoffset(None, -14400))
最后砍掉时区应该很简单(由于你有偏移量,这是多余的),并将“:”改为“。”。在秒和微秒之间。
答案 1 :(得分:0)
由于datetime.timezone
已提供Python 3.2
,因此您可以%z
使用.strptime()
(see docs)。从:
dateparse = lambda x: pd.datetime.strptime(x, '%H:%M:%S:%f %d %m %Y %z %Z')
df = pd.read_csv(path, parse_dates=['time_col'], date_parser=dateparse)
得到:
time_col
0 2015-10-02 11:59:50.322000-04:00
1 2015-10-16 11:11:55.051000-04:00
2 2015-11-02 00:38:37.106000-05:00
3 2015-11-14 04:15:51.600000-05:00
4 2015-11-14 04:15:51.600000-05:00
5 2015-11-28 13:43:28.540000-05:00
6 2015-12-14 09:24:12.723000-05:00
7 2015-12-28 13:28:12.346000-05:00