将 PDT/PST 时区列转换为 UTC 时区

Posted

技术标签:

【中文标题】将 PDT/PST 时区列转换为 UTC 时区【英文标题】:Converting PDT/PST timezone column to UTC timezone 【发布时间】: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

感谢您提供简单的答案。

【问题讨论】:

【参考方案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)) 工作完美。非常感谢!

以上是关于将 PDT/PST 时区列转换为 UTC 时区的主要内容,如果未能解决你的问题,请参考以下文章

将UTC时间戳转换为熊猫中的本地时区问题

将时区从时间戳列转换为各种时区

Pandas 使用单独的时区列转换日期时间

Postgres UTC时区vs当地时区

如何将熊猫中的日期时间列全部转换为同一时区

将 UTC 日期转换为其他时区