使用pd.to_datetime()更新DataFrame时间列遇DST及赋值警告问题求助
解决DataFrame时间列时区转换的SettingWithCopyWarning与AttributeError问题
问题重现
你的数据包含带时区偏移的时间字符串,尝试转换为datetime并做时区调整时,遇到两个问题:
- 直接赋值
df.Time触发SettingWithCopyWarning,提示操作的是DataFrame切片的副本 - 改用
df.loc[:, "Time"]赋值时,第二步调用.dt.tz_convert抛出AttributeError,提示无法对非datetime类型使用.dt访问器
数据示例:
0 2023-10-08T19:44:29.862-04:00 1 2023-10-09T01:06:42.762-04:00 2 2023-10-12T18:35:09.060-04:00 3 2023-10-12T18:55:02.459-04:00 4 2023-10-17T23:56:28.330-04:00 5 2023-10-18T02:51:33.481-04:00 6 2023-10-24T15:59:30.074-04:00 7 2023-10-24T18:00:55.081-04:00 8 2023-11-03T15:59:30.021-04:00 9 2023-11-06T15:59:30.824-05:00 10 2023-11-07T15:59:32.386-05:00 11 2023-11-09T15:59:30.032-05:00 12 2023-11-10T15:59:57.509-05:00 14 2023-11-13T15:59:31.065-05:00 Name: Time, dtype: object
原执行代码:
df.Time = pd.to_datetime(df.Time, errors='coerce',utc=True) df.Time = df.Time.dt.tz_convert("Australia/Sydney") df.Time = pd.to_datetime(df.Time) - pd.Timedelta(8, "H")
问题原因
- SettingWithCopyWarning:你的
df大概率是通过其他DataFrame的切片生成的(比如df = original_df[['Time', 'OtherCol']]),此时df是原DataFrame的视图而非独立副本,直接修改视图的列会触发警告。 - AttributeError:在视图上使用
.loc赋值时,Pandas可能无法正确同步列的类型信息,导致第一步赋值后,Time列表面是datetime类型,但内部仍被识别为object,进而无法使用.dt访问器。
解决方案
步骤1:创建DataFrame的独立副本
先将df转换为独立副本,彻底避免视图引发的警告和类型同步问题:
df = df.copy()
步骤2:使用.loc安全赋值并优化时间转换
修改时间列时全程用.loc,同时优化第三步的时区移除操作(无需重复调用pd.to_datetime):
# 解析为带UTC时区的datetime类型 df.loc[:, "Time"] = pd.to_datetime(df["Time"], errors='coerce', utc=True) # 转换为澳大利亚悉尼时区 df.loc[:, "Time"] = df.loc[:, "Time"].dt.tz_convert("Australia/Sydney") # 移除时区信息并减去8小时(替代原代码的pd.to_datetime转换) df.loc[:, "Time"] = df.loc[:, "Time"].dt.tz_localize(None) - pd.Timedelta(hours=8)
关键说明
- 用
df.copy()生成独立副本后,所有赋值操作都是针对真实的DataFrame对象,不会触发SettingWithCopyWarning。 .dt.tz_localize(None)可以直接移除datetime的时区信息,比pd.to_datetime()更高效且语义明确。- 全程使用
.loc[:, "Time"]赋值,确保Pandas正确跟踪列的类型,避免.dt访问器报错。
内容的提问来源于stack exchange,提问作者Kel
相关产品推荐
相关产品推荐

