绘制2005年每日最高温折线图遇SettingWithCopyWarning问题求助
解决SettingWithCopyWarning并绘制2005年每日最高气温折线图
这个SettingWithCopyWarning警告的根源是:data_2005 = data[data['Year'] == 2005]得到的是原DataFrame的视图,不是独立的副本。直接修改视图会触发Pandas的警告,防止出现潜在的数据不一致问题。
修复方案与完整代码
1. 先创建独立副本
把过滤数据的代码改成下面这样,让data_2005成为独立的DataFrame:
data_2005 = data[data['Year'] == 2005].copy()
2. 优化数据处理流程(含折线图绘制)
原代码里的日期只生成了每月1号,没法对应到具体某天,下面是修正后能生成全年完整日期并绘制折线图的代码:
import pandas as pd import matplotlib.pyplot as plt # 读取数据 data = pd.read_csv('https://raw.githubusercontent.com/dereksonderegger/444/master/data-raw/FlagMaxTemp.csv') # 过滤2005年数据并创建独立副本 data_2005 = data[data['Year'] == 2005].copy() # 提取每日最高温列,把宽表转成长表 max_temp_cols = [str(i) for i in range(1, 32)] max_temp_data = data_2005.melt(id_vars=['Year', 'Month'], value_vars=max_temp_cols, var_name='Day', value_name='Temperature') # 转换Day为整数,删掉无效日期(比如2月没有30、31号)对应的空值 max_temp_data['Day'] = max_temp_data['Day'].astype(int) max_temp_data = max_temp_data.dropna(subset=['Temperature']) # 生成完整的日期列 max_temp_data['Date'] = pd.to_datetime(max_temp_data[['Year', 'Month', 'Day']]) # 设置日期为索引并按时间排序 max_temp_data.set_index('Date', inplace=True) max_temp_data.sort_index(inplace=True) # 绘制折线图 plt.figure(figsize=(12, 6)) plt.plot(max_temp_data.index, max_temp_data['Temperature'], label='每日最高气温') plt.title('2005年每日最高气温折线图') plt.xlabel('日期') plt.ylabel('气温') plt.legend() plt.grid(True) plt.show()
核心改进点
- 用
.copy()彻底消除视图修改的警告 - 直接保留Year、Month列,结合Day生成真实日期,解决原代码日期不精确的问题
- 过滤无效日期的空值,保证数据准确
- 排序日期索引,让折线图按时间顺序展示
内容的提问来源于stack exchange,提问作者khali-blinks
相关产品推荐
相关产品推荐

