Datetime模块和Pandas to_datetime给出不同的结果

时间:2017-11-23 08:39:15

标签: python pandas datetime utc localtime

我有一个包含UTC日期时间的字符串

utc_str = '2017-11-21T23:00+0100'

在我当地时间(欧洲/柏林)是:

local_time = '2017-11-22 00:00'

这是我想从utc_string获得的理想值。

我可以将utc_string转换为local_time,只需使用:

import datetime as dt
utc_time = dt.datetime.strptime(date_str, '%Y-%m-%dT%H:%M%z')
local_time = utc_time.replace(tzinfo=pytz.utc).astimezone(pytz.timezone('Europe/Berlin'))

print(local_time.strftime('%Y-%m-%d %H:%M'))
>>> 2017-11-22 00:00

但是,当我使用Pandas时,我会得到不同的结果。它似乎不适用UTC偏移量:

import pandas as pd
pd_date = pd.to_datetime(date_str, utc=True)

print(pd_date.strftime('%Y-%m-%d %H:%M'))
>>> '2017-11-21 22:00'

如果我尝试执行与datetime模块相同的过程,那就天真地说, 结果仍未结束:

pd_date = pd.to_datetime(date_str, utc=True)
pd_date = pd_date.replace(tzinfo=pytz.utc).astimezone(pytz.timezone('Europe/Berlin'))

print(pd_date.strftime('%Y-%m-%d %H:%M'))
>>> '2017-11-21 23:00'

有什么我不理解的吗?我使用pd.to_datetime或其他错误吗?在Python 3.6,Windows 7上。

1 个答案:

答案 0 :(得分:1)

正如评论中所述,我认为local_time的代码错误

utc_time
datetime.datetime(2017, 11, 21, 23, 0, tzinfo=datetime.timezone(datetime.timedelta(0, 3600))
utc_time.replace(tzinfo=pytz.utc)
'datetime.datetime(2017, 11, 21, 23, 0, tzinfo=<UTC>)'

所以此replace会从'+0100中移除datetime,但其余部分保持不变

utc_time.replace(tzinfo=pytz.utc).astimezone(pytz.timezone('Europe/Berlin'))
"datetime.datetime(2017, 11, 22, 0, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>)"

然后在23:00UTC增加1小时,所以按预期成为柏林的第二天午夜

pd.to_datetime(utc_str, utc=True)
Timestamp('2017-11-21 22:00:00+0000', tz='UTC')

行为的差异是由于构造函数。 pd.to_datetime计算时间和时区回到22:00UTC而不是23:00 + 0100,所以如果你用UTC替换时区信息,它什么都不会改变

当地时间

您的utc_time对象位于正确的时区,因此如果您想要当地时间,您可以在大熊猫中utc_time.strftime('%Y-%m-%d %H:%M')进行pd.to_datetime(utc_str, utc=True).astimezone(pytz.timezone('Europe/Berlin')).strftime('%Y-%m-%d %H:%M')