Python 2005年至2015年期间365天内不同气象站的最高和最低温度
以下是2005年至2015年期间不同气象站每天最高和最低温度的数据框。我必须绘制2005年至2015年期间一年365天内每天最高和最低温度的线形图。我应该按日期和元素对它们进行分组吗?我应该如何处理这个问题?Python 2005年至2015年期间365天内不同气象站的最高和最低温度,python,pandas,dataframe,matplotlib,pandas-groupby,Python,Pandas,Dataframe,Matplotlib,Pandas Groupby,以下是2005年至2015年期间不同气象站每天最高和最低温度的数据框。我必须绘制2005年至2015年期间一年365天内每天最高和最低温度的线形图。我应该按日期和元素对它们进行分组吗?我应该如何处理这个问题? 例如,以1月5日为例,我必须找到2005年至2015年所有1月5日TMAX(数据值)的最大值,类似于TMIN ID Date Element Data_Value 0 USW00094889 2014-11-12 TMAX 22 1
例如,以1月5日为例,我必须找到2005年至2015年所有1月5日TMAX(数据值)的最大值,类似于TMIN
ID Date Element Data_Value
0 USW00094889 2014-11-12 TMAX 22
1 USC00208972 2009-04-29 TMIN 56
2 USC00200032 2008-05-26 TMAX 278
3 USC00205563 2005-11-11 TMAX 139
4 USC00200230 2014-02-27 TMAX -106
5 USW00014833 2010-10-01 TMAX 194
6 USC00207308 2010-06-29 TMIN 144
7 USC00203712 2005-10-04 TMAX 289
8 USW00004848 2007-12-14 TMIN -16
9 USC00200220 2011-04-21 TMAX 72
10 USC00205822 2013-01-16 TMAX 11
我认为您(或我们)缺少一些数据,但这可能是练习的一部分:
import matplotlib.pyplot as plt
import pandas as pd
temp_list = [
['2009-04-29', 'TMIN', 56],
['2008-05-26', 'TMAX', 278],
['2005-11-11', 'TMAX', 139],
['2014-02-27', 'TMAX', -106],
['2010-10-01', 'TMAX', 194],
['2010-06-29', 'TMIN', 144],
['2005-10-04', 'TMAX', 289],
['2007-12-14', 'TMIN', -16],
['2011-04-21', 'TMAX', 72],
['2013-01-16', 'TMAX', 11]
]
column_names = ['date', 'min_max', 'temp']
temperature_df = pd.DataFrame(data=temp_list, columns=column_names)
temperature_df['date'] = pd.to_datetime(temperature_df['date'])
temperature_df['date_y'] = temperature_df['date'].dt.year
temperature_df.sort_values(by=['date_y'], ascending=[True], inplace=True)
temperature_df.drop(columns='date', inplace=True)
temperature_df.set_index('date_y', inplace=True)
#pivot
temperature_df = temperature_df.pivot_table(values='temp', index='date_y', columns='min_max')
print(temperature_df)
结果分为:
min_max TMAX TMIN
date_y
2005 214.0 NaN
2007 NaN -16.0
2008 278.0 NaN
2009 NaN 56.0
2010 194.0 144.0
2011 72.0 NaN
2013 11.0 NaN
2014 -106.0 NaN
“NaN”是缺少的数据,然后您可以对它们进行插值,或者使用backford/forward现有数据填充它们
我不会把它们填满,因为它们是每年的临时数据,也不意味着任何东西要向后/向前填充,然后你可以找到一种方法来插值(也许他们希望你做一些研究,比如这些年/日期的全球变暖…)
如果您确实需要绘制图表,您可以插值或分散。
pandas允许您插值,但您需要安装'scipy'
# interpolate
temperature_df['TMAX'] = temperature_df['TMAX'].interpolate(method='polynomial', order=2)
temperature_df['TMIN'] = temperature_df['TMIN'].interpolate(method='polynomial', order=2)
print(temperature_df)
#chart
temperature_df.plot()
plt.show()
图表将显示:
然后,你可以问另一个问题,关于如何获得分钟或最大丢失的分数。
最好的 首先要重新创建示例数据:
df = pd.DataFrame({"Date":np.repeat(pd.date_range("2005-01-01","2015-12-31"),2)})
df["Element"] = np.resize(["TMAX","TMIN"],len(df))
df["Data_Values"] = np.random.randint(-106,300,len(df))
从这里开始,您应该首先透视您的元素列:
df = df.pivot_table(index="Date", columns="Element",values="Data_Values", aggfunc=["min","max"])
print (df)
min max
Element TMAX TMIN TMAX TMIN
Date
2005-01-01 167 215 240 215
2005-01-02 -34 181 100 181
2005-01-03 131 227 221 227
2005-01-04 107 295 167 295
2005-01-05 64 -72 191 -72
... ... ... ... ...
2015-12-27 11 -101 218 -101
2015-12-28 21 237 269 237
2015-12-29 -106 100 144 100
2015-12-30 40 217 241 217
2015-12-31 -20 -75 109 -75
然后您可以groupby
月份和日期:
print (df.groupby([df.index.month, df.index.day]).agg({('min', 'TMIN'):"min",('max', 'TMAX'):"max"}))
min max
TMIN TMAX
Date Date
1 1 -76 287
2 -78 282
3 -101 283
4 -81 290
5 -72 282
6 -37 291
7 -49 299
...
每天还是线性图?您没有每年的最小mac值:2007年的最大值缺失,2008年的最小值,2009年的最大值,2001年的最大值等等,这是您任务/练习的一部分吗?例如,以1月5日为例,然后我必须找到TMAX的最大值(数据值)从2005年到2015年的1月5日,与TMIN类似。我必须绘制365天的TMAX图。在给定的年份跨度内,一年中的每一天的最大值,谢谢.df=df.pivot(index=“Date”,columns=“Element”,values=“Data_Value”)在看到您的答案后,我尝试了上述代码,但出现了一个错误ValueError:索引包含重复条目,无法重塑
每个日期都有多个TMAX
和TMIN
?是,例如,请参见以下内容:Date ID Element Data\u Value
2005-01-01 USW00004848 TMIN 0
2005-01-01 USC0207320 TMAX 150
2005-01-01 USW00014820 TMIN-11
2005-01-01 USW00014833 TMIN-44
。请参见上面编辑的内容。否,该数据集来自不同的气象站,用于多年(2005-2015年)内一天的最高和最低温度。我需要以一年365天为x轴绘制tmax和tmin的线图,谢谢您的帮助。