Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2005年至2015年期间365天内不同气象站的最高和最低温度_Python_Pandas_Dataframe_Matplotlib_Pandas Groupby - Fatal编程技术网

Python 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

以下是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   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的线图,谢谢您的帮助。