我有一个日期值的列表,格式为“YYYY-MM-DD”。这些值处于本地PC的时区中(对我而言未知)。这些值作为Pandas数据帧中的Series加载,并且我想将它们转换为UTC时间戳。
- 如果我使用非常简单的代码:
ts = pd.to_datetime(s, format="%Y-%m-%d")
print(ts[0])
print(int(ts[0].timestamp()))
print(ts[0].strftime("%d.%m.%Y %Z"))
它给我输出:
2021-01-01 00:00:00
1609459200 --> this is 'Friday, January 1, 2021 0:00:00 UTC'
01.01.2021
即,它将源字符串作为UTC,并将其放入UTC中。但我的源字符串是本地时间,输出不正确。
- 然后我发现有一种选项可以提供源字符串的时区信息:
s = pd.Series(['2021-01-01 Europe/Moscow', '2021-01-02 Europe/Moscow'])
ts = pd.to_datetime(s, format="%Y-%m-%d %Z")
print(ts[0])
print(int(ts[0].timestamp()))
print(ts[0].strftime("%d.%m.%Y %Z"))
而且它给我提供了我真正需要的结果:
2021-01-01 00:00:00+03:00
1609448400 --> this is correct 'Thursday, December 31, 2020 21:00:00 UTC'
01.01.2021 MSK
但时区名称在这里硬编码了。
- 因此,我需要从我的代码工作的计算机上获取本地时区名称。我尝试过以下方式:
from datetime import datetime
from dateutil import tz
print(datetime.now(tz.tzlocal()).tzname())
我输入了 MSK
并获得输出结果,但是输出有一个问题 - 当我试着将其用于 Pandas.to_datetime 时,会产生一个错误:
s = pd.Series(['2021-01-01 MSK', '2021-01-02 MSK'])
ts = pd.to_datetime(s, format="%Y-%m-%d %Z")
ValueError: 时间数据'2021-01-01 MSK'与格式'%Y-%m-%d %Z'不匹配(匹配)
因此,我看到以下几种解决方法:
- 从我的Python代码中以某种方式获取完整的时区名称
Europe/Moscow
,而不是短名称MSK
。 - 或者使
pandas.to_datetime()
格式选项%Z
可以识别时区名称的短形式MSK
。 - 或者在将源字符串导入pandas之前以某种方式预处理它(最不希望的路径,因此我还没有研究它)。
我有点困惑应该选择哪种方法。您能给我建议哪种方法会让我的代码更好吗?