python - 如何从每日数据框中计算每月年平均值并按缩写月份绘制
问题描述
我有几年的降水量和温度的每日值。我想计算一年中每个月(1 月至 12 月)的降水量和温度的平均值。对于降水,我首先需要计算每个月每日降水的总和,然后计算所有年份数据的同一个月的平均值。对于温度,我需要平均这些值的每月平均值(因此所有月份的所有数据的平均值给出完全相同的结果)。完成此操作后,我需要使用缩写月份绘制两组数据(降水和温度)。
我找不到一种方法来计算降水值并能够获得每个月的总和,然后对所有年份进行平均。此外,我无法以缩写月份显示格式。
这是我迄今为止尝试过的(不成功):
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter
example = [['01.10.1965 00:00', 13.88099957, 5.375],
['02.10.1965 00:00', 5.802999973, 3.154999971],
['03.10.1965 00:00', 9.605699539, 0.564999998],
['14.10.1965 00:00', 0.410299987, 1.11500001],
['31.10.1965 00:00', 6.184500217, -0.935000002],
['01.11.1965 00:00', 0.347299993, -5.235000134],
['02.11.1965 00:00', 0.158299997, -8.244999886],
['03.11.1965 00:00', 1.626199961, -3.980000019],
['24.10.1966 00:00', 0, 3.88499999],
['25.10.1966 00:00', 0.055100001, 1.279999971],
['30.10.1966 00:00', 0.25940001, -5.554999828]]
names = ["date","Pobs","Tobs"]
data = pd.DataFrame(example, columns=names)
data['date'] = pd.to_datetime(data['date'], format='%d.%m.%Y %H:%M')
#I think the average of temperature is well computed but the precipitation would give the complete summation for all years!
tempT = data.groupby([data['date'].dt.month_name()], sort=False).mean().eval('Tobs')
tempP = data.groupby([data['date'].dt.month_name()], sort=False).sum().eval('Pobs')
fig = plt.figure(); ax1 = fig.add_subplot(1,1,1); ax2 = ax1.twinx();
ax1.bar(tempP.index.tolist(), tempP.values, color='blue')
ax2.plot(tempT.index.tolist(), tempT.values, color='red')
ax1.set_ylabel('Precipitation [mm]', fontsize=10)
ax2.set_ylabel('Temperature [°C]', fontsize=10)
#ax1.xaxis.set_major_formatter(DateFormatter("%b")) #this line does not work properly!
plt.show()
解决方案
这是您的问题的工作代码:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter
import matplotlib.dates as mdates
example = [['01.10.1965 00:00',13.88099957,5.375], ...]
names = ["date","Pobs","Tobs"]
data = pd.DataFrame(example, columns=names)
data['date'] = pd.to_datetime(data['date'], format='%d.%m.%Y %H:%M')
# Temperature:
tempT = data.groupby([data['date'].dt.month_name()], sort=False).mean().eval('Tobs')
# Precipitation:
df_sum = data.groupby([data['date'].dt.month_name(), data['date'].dt.year], sort=False).sum() # get sum for each individual month
df_sum.index.rename(['month','year'], inplace=True) # just renaming the index
df_sum.reset_index(level=0, inplace=True) # make the month-index to a column
tempP = df_sum.groupby([df_sum['month']], sort=False).mean().eval('Pobs') # get mean over all years
fig = plt.figure();
ax1 = fig.add_subplot(1,1,1);
ax2 = ax1.twinx();
xticks = pd.to_datetime(tempP.index.tolist(), format='%B').sort_values() # must work for both axes
ax1.bar(xticks, tempP.values, color='blue')
ax2.plot(xticks, tempT.values, color='red')
plt.xticks(pd.to_datetime(tempP.index.tolist(), format='%B').sort_values()) # to show all ticks
ax1.xaxis.set_major_formatter(mdates.DateFormatter("%b")) # must be called after plotting both axes
ax1.set_ylabel('Precipitation [mm]', fontsize=10)
ax2.set_ylabel('Temperature [°C]', fontsize=10)
plt.show()
说明: 从这个 StackOverflow 答案开始,DateFormatter 使用 mdates。 为此,您需要从月份名称中创建一个 DatetimeIndex-Array,然后 DateFormatter 可以重新格式化。
至于计算,我理解您的问题的解决方案,即我们取每个月内的总和,然后取这些总和多年来的平均值。这将为您提供所有年份每月的平均总降水量。
推荐阅读
- javascript - 您如何存储具有复杂词法范围的激活记录并将函数作为结果返回等?
- python-3.x - SMTPAuthenticationError 在 /
- python - 如何在 Django Rest Framework 中显示 ManyToMany 字段的值而不是它们的 Id?
- node.js - UUID 依赖项中的 googleapis-common 抛出错误
- kubernetes - 具有一个 Job manager 的单个 Flink Cluster 中的理想任务管理器数量
- python - 当我更改 python pandas 数据框中的索引时,matplotlib 图表发生了变化
- php - Symfony 表单提交后提交填充实体类型
- string - 如何将制表符分隔的数据(始终以字母开头)合并为一个字符串?
- javascript - 为什么 react render 接受一个块而 return 不接受?
- sparql - 如何列出自定义 Wikibase 实例上的所有属性