You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

绘制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:12:51