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

4
我有一个pandas列,其中包含PDT和PST日期时间值。 示例:
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
请提供简单的答案。
2个回答

2

使用to_datetime,通过dateparser.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_localize函数,它可以使用None参数:

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

1
你的输出不是UTC时间。 - Salvin D'souza
1
@SalvinD'souza - 你能测试另一种解决方案吗? - jezrael
有趣的是,dateparser解析为Python datetime对象时具有固定的UTC偏移量 - 我之前不知道这一点(因为此处混合偏移量,pandas保留dtype)。从“正确行为”的角度来看,我认为dateutil的解析器做得更好,因为它至少会发出警告,如果您用缩写的tz名称喂它(因为可能不明确)。 - FObersteiner
1
@jezrael 这个解决方案 (pd.to_datetime(df['PDT/PST'].replace({'PDT':'-07:00','PST':'-08:00'}, regex=True), utc=True).dt.tz_localize(None)) 完美地解决了问题。非常感谢! - Salvin D'souza

1
另一种选择:使用dateutil的解析器并提供tzinfos;然后转换为协调世界时(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() 和时区?

如果需要,现在你可以使用特定的格式将其格式化为字符串,例如:

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

1
如果性能很重要,第二种解决方案使用{'PDT':'-07:00','PST':'-08:00'}替换是否更好?我问这个问题是因为你是日期时间方面的专家(在我看来 ;) )。 - jezrael
1
@jezrael 是的,我认为从性能方面来说这将更有效率。你只需要了解正确的UTC偏移量即可^^ - FObersteiner

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