如何将 pandas 中的 datetime 列全部转换为同一个时区

如何将 pandas 中的 datetime 列全部转换为同一个时区

在本文中,我们将介绍如何使用 Pandas 将 datetime 列转换为同一个时区。在处理时间序列数据时,不同的时区可能会给我们带来困扰,因此将所有的 datetime 转换为同一个时区是一种很常见的需求。

阅读更多:Pandas 教程

查看当前时区信息

在开始转换时,我们需要先了解当前 datetime 的时区信息。我们可以使用 pandas 中的 tz_localize(None) 方法将 datetime 转换为本地时间,并使用 .dt.tzinfo 查看其时区信息。示例代码如下:

import pandas as pd
df = pd.read_csv('data.csv')
print(df['datetime'].head())

# 将 datetime 转换为本地时间
datetime_local = df['datetime'].dt.tz_localize(None)
# 查看时区信息
print(datetime_local.dt.tzinfo)

如果打印结果为 None,则表明该 datetime 列没有指定时区信息。

转换为指定时区

我们可以使用 pytz 库将 datetime 列转换为指定的时区。先导入 pytz 库,然后使用 timezone 方法指定目标时区,最后使用 tz_localize 方法将 datetime 转换为指定的时区。示例代码如下:

import pytz

# 将 datetime 列转换为指定时区
datetime_utc = df['datetime'].dt.tz_localize('UTC')
datetime_shanghai = datetime_utc.dt.tz_convert(pytz.timezone('Asia/Shanghai'))

上述代码将 datetime 列转换为 UTC 时区,然后将 UTC 时区转换为上海时区。注意,在使用 tz_localize 方法和 tz_convert 方法时,必须使用 dt 属性。如果直接使用 df['datetime'].tz_localize('UTC'),会提示 AttributeError: 'Series' object has no attribute 'tz_localize'

使用 apply

我们还可以使用 pandas 中的 apply 方法对每个 datetime 进行操作,并将结果赋值到新的一列中。示例代码如下:

def to_shanghai(dt):
    dt_utc = dt.tz_localize('UTC')
    return dt_utc.astimezone(pytz.timezone('Asia/Shanghai'))

df['datetime_shanghai'] = df['datetime'].apply(to_shanghai)

上述代码定义了一个 to_shanghai 函数,该函数将传入的 datetime 列转换为 UTC 时区后再转换为上海时区,并将结果返回。然后使用 apply 方法对每个 datetime 进行操作,并将结果赋值到新的一列 datetime_shanghai 中。

支持 datetime64[ns]

上面的示例代码可以处理 datetime 类型的数据,但是对于 datetime64[ns] 类型的数据,需要先将其转换为 pandas 中的 Timestamp,然后再进行转换。示例代码如下:

def to_shanghai(dt):
    dt_local = pd.Timestamp(dt).tz_localize('UTC')
    return dt_local.tz_convert(pytz.timezone('Asia/Shanghai'))

df['datetime_shanghai'] = df['datetime'].apply(to_shanghai)

上述代码将传入的 datetime64[ns] 转换为 Timestamp 后再进行转换。

总结

本文介绍了如何使用 Pandas 将 datetime 列转换为同一个时区。我们可以使用 tz_localize 方法、tz_convert 方法或者 apply 方法实现转换,并使用 pytz 库指定目标时区。在使用 apply 方法时,需要注意不同类型的 datetime 的处理方式。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程