Pandas错误地转换日期时间值列表

时间:2016-08-21 20:54:53

标签: datetime pandas

我有一个日期时间值列表,并希望将列表转换为pandas.Series实例。代码归结为以下内容:

from datetime import datetime
from datetime import timedelta
from dateutil import parser

day = parser.parse('2016-08-07T00:00:00Z')
dates = [day + timedelta(days=delta) for delta in range(80)]

pandas.Series(dates)

让我感到困惑的是,上面的代码返回了许多1970-01-01的日期时间实例:

0    2016-08-07 00:00:00+00:00
1    1970-01-01 00:00:00+00:00
2    1970-01-01 00:00:00+00:00
3    1970-01-01 00:00:00+00:00
4    1970-01-01 00:00:00+00:00
5    1970-01-01 00:00:00+00:00
...

但是,如果我转换任何60个元素或更少元素的子列表,我可以找回一个正确的系列:

from datetime import datetime
from datetime import timedelta
from dateutil import parser

day = parser.parse('2016-08-07T00:00:00Z')
dates = [day + timedelta(days=delta) for delta in range(80)]

pandas.Series(dates[0:60])

注意最后一行,pandas.Series的输入变为日期[0:60]。事实上,它可以是任何日期[n:n + 60],其中n介于0和len(日期)之间 - 60.

0    2016-08-07 00:00:00+00:00
1    2016-08-08 00:00:00+00:00 
2    2016-08-09 00:00:00+00:00
3    2016-08-10 00:00:00+00:00
4    2016-08-11 00:00:00+00:00
5    2016-08-12 00:00:00+00:00
...

我还阅读了关于Series和datetime的Pandas文档,并尝试了Pandas的时间戳,但仍然得到相同的结果。 Pandas版本为0.18.1,iPython笔记本内核使用的Python版本为2.7.3:

print  pandas.__version__

import sys
print(sys.version)

输出

0.18.1
2.7.3 (default, Jun 22 2015, 19:33:41) 
[GCC 4.6.3]

有关我应该查看的内容的任何提示,以找出问题发生的原因以及如何解决问题?

谢谢,

2 个答案:

答案 0 :(得分:0)

我不知道你的Python版本有什么问题,但你可以而且应该使用矢量化(即更有效和更快)的pandas方法而不是vanilla Python方法:

In [181]: pd.Series([pd.to_datetime('2016-08-07T00:00:00Z') + pd.Timedelta(days=delta) for delta in range(80)])
Out[181]:
0    2016-08-07
1    2016-08-08
2    2016-08-09
3    2016-08-10
4    2016-08-11
5    2016-08-12
6    2016-08-13
7    2016-08-14
8    2016-08-15
9    2016-08-16
10   2016-08-17
11   2016-08-18
12   2016-08-19
13   2016-08-20
14   2016-08-21
15   2016-08-22
16   2016-08-23
17   2016-08-24
18   2016-08-25
19   2016-08-26
20   2016-08-27
21   2016-08-28
22   2016-08-29
23   2016-08-30
24   2016-08-31
25   2016-09-01
26   2016-09-02
27   2016-09-03
28   2016-09-04
29   2016-09-05
        ...

答案 1 :(得分:0)

Pandas有实用函数pd.date_range来生成这种对象:

import pandas as pd

pd.Series(pd.date_range(start='2016-08-07T00:00:00Z', periods=80, freq='D'))

输出:

0    2016-08-07 00:00:00+00:00
1    2016-08-08 00:00:00+00:00
2    2016-08-09 00:00:00+00:00
3    2016-08-10 00:00:00+00:00
4    2016-08-11 00:00:00+00:00
5    2016-08-12 00:00:00+00:00
6    2016-08-13 00:00:00+00:00
7    2016-08-14 00:00:00+00:00
8    2016-08-15 00:00:00+00:00
9    2016-08-16 00:00:00+00:00
                ...           
70   2016-10-16 00:00:00+00:00
71   2016-10-17 00:00:00+00:00
72   2016-10-18 00:00:00+00:00
73   2016-10-19 00:00:00+00:00
74   2016-10-20 00:00:00+00:00
75   2016-10-21 00:00:00+00:00
76   2016-10-22 00:00:00+00:00
77   2016-10-23 00:00:00+00:00
78   2016-10-24 00:00:00+00:00
79   2016-10-25 00:00:00+00:00
dtype: datetime64[ns, UTC]