【问题标题】:pandas to_datetime from milliseconds produces incorrect datetime毫秒的熊猫 to_datetime 产生不正确的日期时间
【发布时间】:2017-03-09 14:51:35
【问题描述】:

具有列 dateMillis 的数据框,其中包含从纪元开始以毫秒为单位的时间戳

 In [5]: df.head(5)
    Out[5]: 
       custId     dateMillis
    0   31403  1488232800000
    1   28197  1488232800013
    2   30158  1488232800026
    3   28538  1488232800030
    4   28538  1488232800033

如果我使用 python 的 datetime 将第一行中 dateMillis 的值转换为 datetime,我会得到以下结果

 In [8]: print datetime.datetime.fromtimestamp(df.ix[0]['dateMillis']/1000.0)
    2017-02-27 17:00:00

这是正确的。但是,如果我使用熊猫的 to_datetime 转换列 dateMillis,我会得到 ​​p>

In [11]: df['date'] = pd.to_datetime(df['dateMillis'], unit='ms')
In [12]: df.head(5)
Out[12]: 
   custId     dateMillis                    date
0   31403  1488232800000 2017-02-27 22:00:00.000
1   28197  1488232800013 2017-02-27 22:00:00.013
2   30158  1488232800026 2017-02-27 22:00:00.026
3   28538  1488232800030 2017-02-27 22:00:00.030
4   28538  1488232800033 2017-02-27 22:00:00.033

提前五个小时。机器本身有 EST 时区,所以看起来 pandas 将 datetime 转换为本地时区。

 In [15]: time.tzname
    Out[15]: ('EST', 'EDT')

我希望 to_datetime 与 datetime.fromtimestamp 一致。我为 utc 参数尝试了各种值(真/假/无),但没有帮助。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    默认情况下,UNIX 时间戳(纪元)不知道任何时区。

    “此计数从 1970 年 1 月 1 日 UTC 的 Unix 纪元开始。

    但您可以使用以下解决方法:

    In [47]: datetime.datetime.fromtimestamp(df.loc[0, 'dateMillis']/1000)
    Out[47]: datetime.datetime(2017, 2, 27, 23, 0)   # 23:00:00
    

    在 UTC TZ 中:

    In [48]: pd.to_datetime(df['dateMillis'], unit='ms')
    Out[48]:
    0   2017-02-27 22:00:00.000
    1   2017-02-27 22:00:00.013
    2   2017-02-27 22:00:00.026
    3   2017-02-27 22:00:00.030
    4   2017-02-27 22:00:00.033
    Name: dateMillis, dtype: datetime64[ns]
    

    解决方案:

    In [51]: from tzlocal import get_localzone
    
    In [52]: mytz = get_localzone()
    
    In [53]: mytz
    Out[53]: <DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>
    
    In [54]: pd.to_datetime(df['dateMillis'], unit='ms').dt.tz_localize('UTC').dt.tz_convert(mytz)
    Out[54]:
    0          2017-02-27 23:00:00+01:00
    1   2017-02-27 23:00:00.013000+01:00
    2   2017-02-27 23:00:00.026000+01:00
    3   2017-02-27 23:00:00.030000+01:00
    4   2017-02-27 23:00:00.033000+01:00
    Name: dateMillis, dtype: datetime64[ns, Europe/Berlin]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 2022-01-14
      • 2021-01-06
      • 2022-12-16
      • 2019-06-16
      • 1970-01-01
      相关资源
      最近更新 更多