python - pandas to_datetime from milliseconds 产生不正确的日期时间

标签 python pandas

具有 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 的日期时间将第一行中的 dateMillis 值转换为日期时间,我会得到以下结果

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

这是正确的。但是如果我使用 panda 的 to_datetime 转换列 dateMillis 我得到

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 将日期时间转换为本地时区。

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

我希望 to_datetime 与 datetime.fromtimestamp 保持一致。我尝试了 utc 参数的各种值(True/False/None),但没有帮助。

最佳答案

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

"This count starts at the Unix Epoch on January 1st, 1970 at UTC`.

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

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]

关于python - pandas to_datetime from milliseconds 产生不正确的日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42698421/

相关文章:

python - 这是避免使用 SQLAlchemy/SQLObject 的好方法吗?

python - 查找给定日期之后的第一个星期一的日期

python - 将 2 个 Pandas 列表填充的列连接成 1 个大列表?

python - 识别第二个数据框中的值小于第一个的行

python - 用最少的内存连接 Numpy 数组

python - 属性 getter/setter 在 Python 2 中无效

python - 如何获取每个嵌套列表的第三个元素,但如果第三个元素不存在则将其设置为 null?

python - 按标签选择的 Pandas 有时会返回 Series,有时会返回 DataFrame

python - MySQL `Load Data Infile Local` 对于 .csv 失败,除非我先打开并保存该文件。我怎样才能避免这一步?

python - 对齐 pandas 中的时间序列