将 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_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
将PST
和PDT
替换为-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 时区的主要内容,如果未能解决你的问题,请参考以下文章