pandas.to_datetime()如何将本地时区转换为UTC Unix时间戳?

3

我有一个日期值的列表,格式为“YYYY-MM-DD”。这些值处于本地PC的时区中(对我而言未知)。这些值作为Pandas数据帧中的Series加载,并且我想将它们转换为UTC时间戳。

  1. 如果我使用非常简单的代码:
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中。但我的源字符串是本地时间,输出不正确。

  1. 然后我发现有一种选项可以提供源字符串的时区信息:
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

但时区名称在这里硬编码了。

  1. 因此,我需要从我的代码工作的计算机上获取本地时区名称。我尝试过以下方式:
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之前以某种方式预处理它(最不希望的路径,因此我还没有研究它)。

我有点困惑应该选择哪种方法。您能给我建议哪种方法会让我的代码更好吗?

1个回答

1

我认为你可以使用 Series.dt.tz_localize

from dateutil import tz

s = pd.Series(['2021-01-01', '2021-01-02'])
ts = pd.to_datetime(s, format="%Y-%m-%d").dt.tz_localize(tz.tzlocal())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接