代码之家  ›  专栏  ›  技术社区  ›  StarterKit

熊猫.to\ datetime()如何从本地时区转换为UTC unix时间戳?

  •  1
  • StarterKit  · 技术社区  · 4 年前

    我有一个“YYYY-MM-DD”格式的日期值列表。这些值位于本地PC的时区(我不知道)。这些值作为数据帧中的一个系列加载,我想将它们转换为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
    

    i、 它将源字符串作为UTC,并将其置于UTC中。但是我的源字符串是localtime,输出不正确。

    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
    

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

    from datetime import datetime
    from dateutil import tz
    print(datetime.now(tz.tzlocal()).tzname())
    

    它给了我输出 MSK . 但是这个输出的问题是-当我尝试使用它熊猫.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”不匹配(匹配)

    因此,我看到了以下方法:

    • 或者你可以得到一个完整的时区名称 Europe/Moscow MSK公司 从我的python代码中,
    • pandas.to_datetime() 格式选项 %Z MSK公司 ,

    我有点执着于选择前进的道路。你能给我一些建议吗?哪种方法能给我更好的代码?

    1 回复  |  直到 4 年前
        1
  •  1
  •   jezrael    4 年前

    我想你可以用 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())