Python pandas to_datetime from毫秒产生不正确的datetime

Python pandas to_datetime from毫秒产生不正确的datetime,python,pandas,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 如果我使用pyt

一种数据帧,其列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
这是正确的。但是如果我用panda's将列dateMillis转换为_datetime,我得到

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时区,因此它似乎可以将日期时间转换为本地时区。
 In [15]: time.tzname
    Out[15]: ('EST', 'EDT')
我希望datetime与datetime.fromtimestamp保持一致。我尝试了utc参数的各种值(True/False/None),但没有帮助。

每个默认值的UNIX时间戳(epoch)不知道任何时区

“此计数从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]
[51]中的
:从tzlocal导入获取\u localzone
在[52]中:mytz=get\u localzone()
在[53]中:mytz
出[53]:
在[54]中:pd.to_datetime(df['dateMillis',unit='ms')。dt.tz_本地化('UTC')。dt.tz_转换(mytz)
出[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
名称:dateMillis,数据类型:datetime64[ns,欧洲/柏林]