【问题标题】:Maximum and minimum temperature from different weather stations for each of 365 days in the span of 2005 to 20152005 年至 2015 年 365 天各气象站的最高和最低温度
【发布时间】:2020-08-29 02:12:12
【问题描述】:

以下是从 2005 年到 2015 年每天来自不同气象站的最高和最低温度的数据框。我必须为一年中 365 天的每一天的最高和最低温度绘制折线图,​​跨度为2005-2015。我应该按日期和元素对它们进行分组吗?我应该如何解决这个问题? 例如以 1 月 5 日为例,那么我必须找到从 2005 年到 2015 年与 TMIN 相似的所有 1 月 5 日 TMAX(Data_Value) 的最大值。

             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

【问题讨论】:

  • 每天的图表还是线性图表?您没有每年的最小 mac:缺少 2007 最大值、2008 最小值、2009 最大值、20011 最大值等,这是您的任务/练习的一部分吗?
  • 例如取 1 月 5 日,然后我必须找到 2005 年到 2015 年 1 月 5 日的 TMAX(Data_Value) 的最大值,与 TMIN 相似。我必须绘制 TMAX 的线图 365 天。在给定的年份中,一年中的每一天最多,谢谢。

标签: python pandas dataframe matplotlib pandas-groupby


【解决方案1】:

首先重新创建您的示例数据:

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))

从这里你应该首先pivot你的Element专栏:

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
...

【讨论】:

  • df = df.pivot(index="Date", columns="Element",values="Data_Value") 看到你的回答后我尝试了上面的代码但是有一个错误ValueError: Index contains duplicate entries, cannot reshape
  • 每个日期都有多个TMAXTMIN
  • 是的,例如见下图:Date ID Element Data_Value 2005-01-01 USW00004848 TMIN 02005-01-01 USC00207320 TMAX 1502005-01-01 USC00207320 TMIN -112005-01-01 USW00014833 TMIN -442005-01-01 USW00014833 TMAX 33
  • 在这种情况下,您可以改用pivot_table。请参阅上面的编辑。
  • 不,数据集来自不同的气象站,用于多年(2005-2015)一天的最高和最低温度。我需要为 tmax 和 tmin 绘制一个线图,取 365一年中的天数作为 x 轴,感谢您的帮助。
【解决方案2】:

我认为您(或我们)遗漏了一些数据,但这可能是练习的一部分:

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 现有数据填充它们click

我不会填写它们,因为它们是年度临时值,并且并不意味着向后/向前填写任何内容,然后您可以找到一种插值方法(也许他们希望您进行一些研究,例如全球变暖这些年/日期...)

如果您确实需要绘制图表,您可以插值或散布。 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()

图表将显示:

然后你可以问另一个问题,关于如何获得最小或最大的缺失点。 最好的!

【讨论】:

    猜你喜欢
    • 2019-08-08
    • 2015-09-30
    • 2012-10-14
    • 2012-10-16
    • 2021-09-04
    • 2021-11-12
    • 2016-01-22
    • 2021-02-11
    • 2019-07-17
    相关资源
    最近更新 更多