【问题标题】:Converting PDT/PST timezone column to UTC timezone将 PDT/PST 时区列转换为 UTC 时区
【发布时间】:2022-01-09 13:59:14
【问题描述】:

我有一个包含 PDT 和 PST 日期时间值的 pandas 列。 示例:

PDT/PST
2021-10-29 00:18:38 PDT
2021-10-29 01:08:19 PDT
2021-11-08 19:43:58 PST
2021-11-08 19:56:01 PST

我需要将这些转换为 UTC 时区。 示例:

UTC
2021-10-29 07:18:00

感谢您提供简单的答案。

【问题讨论】:

    标签: python python-3.x pandas datetime jupyter-notebook


    【解决方案1】:

    另一个选项:提供 tzinfos 的 dateutil 解析器;然后转换为 UTC。

    import dateutil
    pacific_tz = dateutil.tz.gettz("US/Pacific")
    
    df['UTC'] = df['PDT/PST'].apply(dateutil.parser.parse,
                                    tzinfos={'PST': pacific_tz,
                                             'PDT': pacific_tz}).dt.tz_convert('UTC')
    
    df['UTC']
    
    0   2021-10-29 07:18:38+00:00
    1   2021-10-29 08:08:19+00:00
    2   2021-11-09 03:43:58+00:00
    3   2021-11-09 03:56:01+00:00
    Name: UTC, dtype: datetime64[ns, UTC]
    

    相关:Python strptime() and timezones?

    现在您可以根据需要将字符串格式化为特定格式,例如

    df['UTC'].dt.strftime('%Y-%m-%d %H:%M:%S')
    
    0    2021-10-29 07:18:38
    1    2021-10-29 08:08:19
    2    2021-11-09 03:43:58
    3    2021-11-09 03:56:01
    Name: UTC, dtype: object
    

    【讨论】:

    • 如果性能很重要,用{'PDT':'-07:00','PST':'-08:00'}替换的第二种解决方案不是更好吗?我问,因为您是日期时间方面的专家(在我看来;))
    • @jezrael 是的,我认为这在性能方面会更有效率。您只需要知道正确的 UTC 偏移量 ^^
    【解决方案2】:

    使用to_datetimedateparser.parse 将字符串转换为日期时间:

    import dateparser
    
    df['PDT/PST'] = pd.to_datetime(df['PDT/PST'].apply(dateparser.parse), utc=True)
    print (df)
                        PDT/PST
    0 2021-10-29 07:18:38+00:00
    1 2021-10-29 08:08:19+00:00
    2 2021-11-09 03:43:58+00:00
    3 2021-11-09 03:56:01+00:00
    

    最后添加Series.dt.tz_localizeNone

    df['PDT/PST'] = (pd.to_datetime(df['PDT/PST'].apply(dateparser.parse), utc=True)
                       .dt.tz_localize(None))
    print (df)
                  PDT/PST
    0 2021-10-29 07:18:38
    1 2021-10-29 08:08:19
    2 2021-11-09 03:43:58
    3 2021-11-09 03:56:01
    

    PSTPDT 替换为-7-8 的解决方案是:

    df['PDT/PST'] = (pd.to_datetime(df['PDT/PST']
                                    .replace({'PDT':'-07:00','PST':'-08:00'}, regex=True), utc=True)
                      .dt.tz_localize(None))
    print (df)
                  PDT/PST
    0 2021-10-29 07:18:38
    1 2021-10-29 08:08:19
    2 2021-11-09 03:43:58
    3 2021-11-09 03:56:01
    

    【讨论】:

    • 您的输出不是 UTC。
    • @SalvinD'souza - 你能测试替代解决方案吗?
    • 有趣的是,dateparser 解析为具有固定 UTC 偏移量的 Python 日期时间对象——我不知道这一点(因为这里的混合偏移量,pandas 保留了 dtype)。在“正确行为”的意义上,我认为 dateutil 的解析器做得更好,因为如果你用缩写的 tz 名称提供它至少会发出警告(因为可能是模棱两可的)。
    • @jezrael 这个解决方案 (pd.to_datetime(df['PDT/PST'] .replace({'PDT':'-07:00','PST':'-08:00' }, regex=True), utc=True) .dt.tz_localize(None)) 工作完美。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2016-11-21
    • 2016-02-13
    • 2016-11-10
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多