如何在Pandas中按行将UTC时间转换为对应时区的时间?
解决方案
要实现逐行将time_gmt转换为tz_id指定时区的需求,你可以通过以下两种可行方法实现:
方法一:使用apply逐行处理
通过自定义函数结合apply(按行遍历)来处理每行的时区转换逻辑:
import pandas as pd def convert_row_timezone(row): tz_id = row['tz_id'] if pd.notna(tz_id): # 转换为指定时区 return row['time_gmt'].tz_convert(tz_id) else: # tz_id为空时返回NaT return pd.NaT # 生成tz_time列 df['tz_time'] = df.apply(convert_row_timezone, axis=1)
方法二:使用列表推导式(效率更高)
对于数据量较大的DataFrame,列表推导式的执行效率通常优于apply,逻辑和上面一致:
df['tz_time'] = [ time_gmt.tz_convert(tz_id) if pd.notna(tz_id) else pd.NaT for time_gmt, tz_id in zip(df['time_gmt'], df['tz_id']) ]
你之前写法的问题分析
第一种写法:
df['time_gmt'].dt.tz_convert(df['tz_id'])tz_convert方法仅接受单个时区字符串/时区对象,无法直接传入Series类型的参数,因此会报错。第二种写法:
lambda x: x.tz_convert(df[pd.notna(df.tz_id)]['tz_id'])
这里的df[pd.notna(df.tz_id)]['tz_id']是整个非空的tz_id列,而非当前行对应的单个时区值,导致无法正确匹配每行的时区,自然无法得到预期结果。
内容的提问来源于stack exchange,提问作者its_me
相关产品推荐
相关产品推荐

