【发布时间】:2018-05-07 03:36:32
【问题描述】:
我有一个包含 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 上。
【问题讨论】:
-
没有
'2017-11-21T23:00+0100'指定时区+0100(欧洲/柏林)而不是UTC?这是22:00UTC -
所以如果我理解正确,字符串要么标记错误,要么 utc 格式错误?那它是什么形式的呢?它在我拥有的数据中,所以我需要知道如何处理它。
-
您使用
replace计算本地时间是错误的。你可以做astimezone(...) -
那么喜欢
pd_date = pd.to_datetime(date_str, utc=True).astimezone(pytz.timezone('Europe/Rome'))? -
确实如此。您可以使用
tz_convertpd.Series([pd.to_datetime(utc_str, utc=True)]).dt.tz_convert(pytz.timezone('Europe/Berlin'))对整个Series执行此操作
标签: python pandas datetime utc localtime