【问题标题】:pandas.to_datetime() how to convert from local timezone to UTC unix timestamp?pandas.to_datetime() 如何从本地时区转换为 UTC unix 时间戳?
【发布时间】:2021-04-25 15:23:17
【问题描述】:

我有一个“YYYY-MM-DD”形式的日期值列表。这些值位于本地 PC 的时区(我不知道)。这些值在 Pandas 数据框中作为系列加载,我想将它们转换为 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. 所以,我需要从我的代码工作的 PC 获取本地时区名称。我试过这样:
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 之前对其进行预处理(最不理想的路径,所以我还没有研究过)。

我有点坚持在这里选择前进的方式。你能给我建议哪种方式可以给我更好的代码吗?

【问题讨论】:

    标签: python pandas timezone


    【解决方案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())
    

    【讨论】:

      猜你喜欢
      • 2019-03-09
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多