使用pandas从csv读取日期时间错误

时间:2016-01-12 03:38:29

标签: python csv datetime pandas

我正在使用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')

但这不起作用,虽然之前我能够将相同的代码用于另一种格式(使用不同的格式说明符)。有什么建议吗?

2 个答案:

答案 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