如何将Pandas中时区各异的日期时间列统一转换为同一时区?
问题1:如何将Pandas数据框中的某一列日期时间转换为全部属于同一时区?
首先得明确你的日期列当前的状态:是无时区感知(naive datetime)还是已经带有时区信息(aware datetime)?
如果是naive datetime(也就是
df['date_col'].dt.tz返回None):
你需要先给它指定原始时区,再转换到目标时区。比如假设原始数据是基于纽约时间采集的,要转成UTC:import pandas as pd # 先把列转为datetime类型(如果还不是的话) df['date_col'] = pd.to_datetime(df['date_col']) # 第一步:指定原始时区 df['date_col'] = df['date_col'].dt.tz_localize('America/New_York') # 第二步:转换到目标时区(比如UTC) df['date_col'] = df['date_col'].dt.tz_convert('UTC')如果已经是aware datetime(
df['date_col'].dt.tz能看到具体时区):
直接用tz_convert转到目标时区就行:df['date_col'] = df['date_col'].dt.tz_convert('Asia/Shanghai')
问题2:从PostgreSQL加载的Pandas数据框包含两列日期时间数据,每列内的日期时间带有不同时区,如何转换为同一时区?
从PostgreSQL加载的datetime列,只要你的驱动(比如psycopg2)配置正确,Pandas会自动识别为带时区的datetime64[ns, tz]类型。处理思路是分别处理每一列,先确认各自的原始时区,再统一转换到目标时区。
举个具体例子:假设你的数据框有两列order_time(原始时区是UTC)和delivery_time(原始时区是'Europe/Paris'),要统一转成'America/Chicago':
import pandas as pd # 假设已经从PostgreSQL加载好数据框df # 确认每列的时区(可选,用来验证) print(df['order_time'].dt.tz) print(df['delivery_time'].dt.tz) # 分别转换到目标时区 df['order_time_chicago'] = df['order_time'].dt.tz_convert('America/Chicago') df['delivery_time_chicago'] = df['delivery_time'].dt.tz_convert('America/Chicago') # 如果你想覆盖原列也可以: # df['order_time'] = df['order_time'].dt.tz_convert('America/Chicago') # df['delivery_time'] = df['delivery_time'].dt.tz_convert('America/Chicago')
如果某一列里存在混合时区(同一列里有不同时区的datetime),这种情况比较少见,但如果遇到,你可以用apply逐行处理:
def convert_to_utc(dt): if dt.tz is None: return dt.tz_localize('UTC') # 假设无时区的默认是UTC return dt.tz_convert('UTC') df['mixed_tz_col'] = df['mixed_tz_col'].apply(convert_to_utc)
内容的提问来源于stack exchange,提问作者Brett Jackson
相关产品推荐
相关产品推荐

