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

Python绘制历史温度数据求助:1816年‘无夏之年’温度可视化

解决1816年每日温度数据的格式问题与绘图指南

嘿,刚接触Python就研究坦博拉火山的“无夏之年”数据,这选题太有意思了!针对你遇到的每行是日期、后续列对应1-12月的特殊数据格式问题,我给你一步步拆解处理流程,代码都是新手友好型的,放心跟着做就行~

第一步:读取原始温度数据

首先我们用pandas来读取文本文件,它能轻松处理这种结构化的表格数据。假设你的数据文件是空格或制表符分隔的(如果是逗号分隔就把sep改成,):

import pandas as pd

# 读取文本文件:header=None表示无表头,names手动给列命名
# 第一列是日期(日),后面12列对应1-12月的温度
df = pd.read_csv(
    '你的温度数据文件名.txt',
    sep='\s+',  # 匹配任意数量的空格/制表符作为分隔符
    header=None,
    names=['day'] + [f'month_{m}' for m in range(1, 13)]
)

运行完这段代码,你可以用print(df.head())看看前几行数据,确认读取是否正确。

第二步:把“宽格式”转成“长格式”

你现在的数据是宽格式:一行对应一个日期的12个月温度,而绘图需要的是长格式:每行对应一个具体日期的温度。用pandas.melt()就能快速转换:

# 转换为长格式:保留day列,把所有month_*列拆成month和temperature两列
df_long = df.melt(
    id_vars='day',  # 保留作为标识的列
    var_name='month',  # 原月份列的列名会存到这个新列里
    value_name='temperature'  # 原温度值会存到这个新列里
)

# 从month列里提取数字(比如把"month_1"变成1)
df_long['month'] = df_long['month'].str.extract('(\d+)').astype(int)

现在df_long的结构就是:day(日)、month(月)、temperature(温度),每一行是一个“日-月”对应的温度值。

第三步:生成完整的日期对象

我们需要把年(1816)、月、日组合成Python能识别的日期格式,这样绘图时x轴才能正确按时间顺序排列:

# 添加年份列(固定是1816年)
df_long['year'] = 1816

# 组合年、月、日为datetime格式,errors='coerce'会把无效日期(比如2月30日)转成空值
df_long['date'] = pd.to_datetime(df_long[['year', 'month', 'day']], errors='coerce')

# 去掉无效日期的行(避免绘图出错)
df_long = df_long.dropna(subset=['date'])

这一步处理后,date列就是标准的日期格式了,后续绘图会非常方便。

第四步:绘制每日温度变化图

用matplotlib来画基础折线图,代码里加了很多新手友好的细节:

import matplotlib.pyplot as plt

# 设置一个好看的绘图风格(可选,但效果更好)
plt.style.use('seaborn-v0_8')

# 创建画布和子图,设置合适的大小
fig, ax = plt.subplots(figsize=(12, 6))

# 绘制折线图:x是日期,y是温度,小点标记数据点,半透明线条避免重叠
ax.plot(
    df_long['date'],
    df_long['temperature'],
    marker='.',
    linestyle='-',
    alpha=0.7,
    color='#2c3e50'
)

# 添加标题和轴标签,突出研究主题
ax.set_title('1816年每日温度变化(坦博拉火山爆发后的"无夏之年")', fontsize=14, pad=20)
ax.set_xlabel('日期', fontsize=12)
ax.set_ylabel('温度', fontsize=12)

# 自动旋转x轴的日期标签,避免挤在一起
plt.gcf().autofmt_xdate()

# 显示图形
plt.show()

运行这段代码,你就能得到一张清晰的1816年温度变化折线图,很容易就能观察到当年夏季的温度异常啦!

额外小提示

  • 如果你的温度数据里有缺失值(比如用NaN或特定符号表示),可以用df_long = df_long.dropna(subset=['temperature'])去掉这些行;
  • 要是想更直观对比季节温度,还可以给df_long添加season列划分季节,然后画分组折线图或者箱线图。

内容的提问来源于stack exchange,提问作者E.Wulf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:27:02