【问题标题】:Pandas converts list of datetime values incorrectlyPandas 错误地转换日期时间值列表
【发布时间】:2016-08-21 20:54:53
【问题描述】:

我有一个日期时间值列表,并希望将列表转换为 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 的输入变成了 dates[0:60]。实际上,它可以是任何日期[n:n+60],其中 n 介于 0 和 len(dates) - 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 notebook 内核使用的 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]

关于我应该调查什么以找出这个问题发生的原因以及如何解决它的任何提示?

谢谢,

【问题讨论】:

  • 我无法将 pandas 0.18.1 与 Python(3.5.1 或 2.7.11)结合使用来重现此问题
  • @MaxU 奇怪。我的 pandas 是 0.18.1,Python 版本是 2.7.3。

标签: datetime pandas


【解决方案1】:

我不知道您的 Python 版本有什么问题,但您可以而且应该使用矢量化(即更高效、更快)的 pandas 方法,而不是普通的 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
        ...

【讨论】:

    【解决方案2】:

    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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 2018-07-15
      • 2018-02-11
      • 2016-01-27
      相关资源
      最近更新 更多