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
相关产品推荐
相关产品推荐

