如何合并列并转换时区?Pandas处理CSV数据报错求助
问题解决与完整实现方案
先搞定代码里的两个错误
1. 消除SettingWithCopyWarning
df_small = df[-10:]得到的是原DataFrame的切片视图,直接给它加列会触发警告,显式创建副本就能解决:
df_small = df[-10:].copy()
2. 修复AttributeError
to_frame()是Series对象的专属方法,你的df_small已经是DataFrame了,不需要多此一举转格式,直接调用to_csv()就行,删掉多余的to_frame(name='new')代码。
完整实现:合并日期时间+时区转换
要完成时区转换,得先把拼接后的字符串转成带布鲁塞尔时区的datetime对象,再转成纽约时区。以下是可直接运行的完整代码:
import pandas as pd from zoneinfo import ZoneInfo # Python3.9+可用,低版本替换成pytz库 # 读取CSV,DATE和TIME按字符串读取,避免自动解析出错 df = pd.read_csv('ES.csv', dtype={'DATE': str, 'TIME': str}) # 取最后10行做测试 df_small = df[-10:].copy() # 1. 合并DATE和TIME为带布鲁塞尔时区的datetime列 # TIME列是HHMM格式(比如1500),拆分出小时分钟,补00秒保证格式正确 df_small['dateandtime_brussels'] = pd.to_datetime( df_small['DATE'] + ' ' + df_small['TIME'].str[:2] + ':' + df_small['TIME'].str[2:] + ':00', format='%Y%m%d %H:%M:%S' ).dt.tz_localize(ZoneInfo('Europe/Brussels')) # 2. 转换为纽约时区 df_small['date&time'] = df_small['dateandtime_brussels'].dt.tz_convert(ZoneInfo('America/New_York')) # 可选:删除中间过渡列,只保留需要的内容 df_small = df_small.drop('dateandtime_brussels', axis=1) # 导出到新CSV df_small.to_csv('new.csv', index=False) # 查看数据结构 df_small.info()
关键说明
- 时区用IANA标准名称:布鲁塞尔是
Europe/Brussels,纽约是America/New_York,如果用pytz库,写法改成pytz.timezone('Europe/Brussels')即可。 - TIME列处理:从截图看TIME是4位数字的HHMM格式,拆分后补秒才能被datetime正确解析。
- 先给原始时间添加布鲁塞尔时区标记(因为原始数据是布鲁塞尔时间,本身无时区信息),再转换为纽约时区,避免时区混乱。
运行效果
代码执行后:
- 不会再出现那两个报错和警告
date&time列会是带纽约时区信息的datetime类型,格式类似2023-09-01 10:00:00-04:00(纽约夏令时)
内容的提问来源于stack exchange,提问作者user22272028
相关产品推荐
相关产品推荐

