全年平均地表气温的时间序列分析和直方图绘制

气温的变化对农业生产、环境、水资源、人民生活有很大的影响,对气温的建模及预测一直是人工智能领域的热点话题。

本文运用时间序列 ARIMA 模型 的建模方法对1850年-2021年全国年平均温度进行分析研究,通过 Python 软件建立了 ARIMA 时间序列模型,本文的研究结果对工农业生产、人民生活具有一定参考价值。

一、导入相关库

首先需要导入 pandas 和 matplotlib.pyplot 两个库。

javascript 复制代码
import pandas as pd
import matplotlib.pyplot as plt

二、解决 matplotlib 中文乱码

在使用 matplotlib 绘图时,常常要求图例使用中文,而若直接使用 plt.title('中文') 或 plt.xlabel('中文') 时,中文可能会出现下面的小方块。​​

在导入上述模块后加入下面以下**字体设置(中文)坐标编码(不支持负数)**代码。

scss 复制代码
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来设置字体样式(目前是黑体)以正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 默认是使用Unicode负号,设置正常显示字符,如正常显示负号

若仍无法解决中文字体乱码问题,可能是电脑没有 'SimHei' 这个字体,可以试着用 'FangSong' 等其他字体,其他字体可见如下 "plt.rcParams 参数的使用"中的其他具体字体。

plt.rcParams 参数的使用:

python 复制代码
plt.rcParams['figure.figsize'] = (5.0, 4.0)     # 显示图像的最大范围
plt.rcParams['image.interpolation'] = 'nearest' # 差值方式,设置 interpolation style
plt.rcParams['image.cmap'] = 'gray'             # 灰度空间

# 设置rc参数显示中文标题
# 设置字体为SimHei显示中文
plt.rcParams['font.sans-serif'] = 'SimHei'

# 设置其他字体显示中文
plt.rcParams['font.sans-serif']=['STSong']  # 中文宋体
plt.rcParams['font.sans-serif']=['SimHei']  # 中文黑体
plt.rcParams['font.sans-serif']=['Kaiti']  # 中文楷体
plt.rcParams['font.sans-serif']=['Lisu']  # 中文隶书
plt.rcParams['font.sans-serif']=['FangSong']  # 中文仿宋
plt.rcParams['font.sans-serif']=['YouYuan']  # 中文幼圆

# 设置正常显示字符
plt.rcParams['axes.unicode_minus'] = False
plt.title('sin曲线')
# 设置线条样式
plt.rcParams['lines.linestyle'] = '-.'
# 设置线条宽度
plt.rcParams['lines.linewidth'] = 3
# 绘制sin曲线
plt.plot(x, y, label='$sin(x)$')

三、读取 Excel 数据

Python 中的 pandas 库是数据分析中使用频率最高的库之一,而 parse_dates 是 pandas 库中常用的参数之一。在读取 CSV 或 Excel 等格式的数据时,parse_dates 参数可以让我们将指定的列中的数据解析为日期,并将其作为 DataFrame 的行索引。parse_dates 参数可以简化对日期数据的处理,使我们更加专注于数据的分析和挖掘。

读取 data.xlsx 里的数据,限定表头为 "Sheet2"(经过数据处理,把准备读取的数据放到了表头2,故此处需标明表头序号)。下面将以读取 Excel 文件为例,演示如何使用 parse_dates 参数:

ini 复制代码
# 读取Excel数据
data = pd.read_excel('data.xlsx', sheet_name='Sheet2', parse_dates=['时间'])

上述代码中,我们通过 read_csv 函数读取了 Excel 文件,并在参数列表中设置 parse_dates 为指定列名,实现了将"时间"解析为格式化时间。运行代码,我们可以看到输出的 DataFrame 的行索引已经改为时间格式。

四、计算平均值和标准差

在绘制时间序列图和直方图之前,需要计算平均值和标准差,详细公式如下:

平均值:

标准差:

ini 复制代码
# 计算平均值和标准差
average = data['温度距平值(°C)'].mean()
std_dev = data.loc[data['时间'].dt.year.between(1961, 1990), '温度距平值(°C)'].std()

五、绘制时间序列图

ini 复制代码
# 绘制时间序列图
plt.figure(figsize=(10, 6))
plt.plot(data['时间'], data['温度距平值(°C)'], label='温度距平值')
plt.axhline(y=average, color='r', linestyle='--', label='平均值: {:.2f}'.format(average))
plt.axhline(y=std_dev, color='g', linestyle='--', label='标准差: {:.2f}'.format(std_dev))
plt.xlabel('年份')
plt.ylabel('温度距平值(°C)')
plt.title('全球年平均地表面大气温度时间序列图')
plt.legend()
plt.grid(True)
plt.show()

六、绘制直方图

ini 复制代码
# 绘制直方图
plt.figure(figsize=(10, 6))
plt.hist(data['温度距平值(°C)'], bins=20, edgecolor='black')
plt.axvline(x=average, color='r', linestyle='--', label='平均值: {:.2f}'.format(average))
plt.axvline(x=std_dev, color='g', linestyle='--', label='标准差: {:.2f}'.format(std_dev))
plt.xlabel('温度')
plt.ylabel('频次')
plt.title('全球年平均地表面大气温度直方图')
plt.legend()
plt.grid(True)
plt.show()

七、代码部分

css 复制代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*
"""
@File    :全年平均地表气温的时间序列图和直方图.py
@IDE     :PyCharm
@Author  :源于花海
@Date    :2023/09/04 00:11
"""
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来设置字体样式(目前是黑体)以正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 默认是使用Unicode负号,设置正常显示字符,如正常显示负号

# 读取Excel数据
data = pd.read_excel('data.xlsx', sheet_name='Sheet2', parse_dates=['时间'])

# 计算平均值和标准差
average = data['温度距平值(°C)'].mean()
std_dev = data.loc[data['时间'].dt.year.between(1961, 1990), '温度距平值(°C)'].std()

# 绘制时间序列图
plt.figure(figsize=(10, 6))
plt.plot(data['时间'], data['温度距平值(°C)'], label='温度距平值')
plt.axhline(y=average, color='r', linestyle='--', label='平均值: {:.2f}'.format(average))
plt.axhline(y=std_dev, color='g', linestyle='--', label='标准差: {:.2f}'.format(std_dev))
plt.xlabel('年份')
plt.ylabel('温度距平值(°C)')
plt.title('全球年平均地表面大气温度时间序列图')
plt.legend()
plt.grid(True)
plt.show()

# 绘制直方图
plt.figure(figsize=(10, 6))
plt.hist(data['温度距平值(°C)'], bins=20, edgecolor='black')
plt.axvline(x=average, color='r', linestyle='--', label='平均值: {:.2f}'.format(average))
plt.axvline(x=std_dev, color='g', linestyle='--', label='标准差: {:.2f}'.format(std_dev))
plt.xlabel('温度')
plt.ylabel('频次')
plt.title('全球年平均地表面大气温度直方图')
plt.legend()
plt.grid(True)
plt.show()
相关推荐
数据智能老司机16 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机17 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机17 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机17 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i17 小时前
drf初步梳理
python·django
每日AI新事件17 小时前
python的异步函数
python
这里有鱼汤18 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook1 天前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室1 天前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三1 天前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试