首页 > 解决方案 > 无论年份如何,如何按日期的日月部分对数据进行分组?

问题描述

我有一个大数据框,它的前 5 行是:

       Date     Element     Data_Value
0   2010-11-25    TMIN         228
1   2014-08-03    TMAX         332
2   2012-04-03    TMAX         311
3   2009-11-14    TMAX         294
4   2011-10-20    TMIN         220

这些数据是
2005-2014 年期间的最低和最高温度 (TMIN & TMAX) 的每日测量值,并且同一日期有多个 TMIN 和 TMAX(它们是来自不同设备的测量值)。

我需要最低温度

我需要制作一个包含以下列的数据框: 第 1 列:日期,但以日和月为单位(年份不重要) 第 2 列:在该期间测量的给定日月的温度最小值(Data_Value)上面提到的,即对于 12 月 31 日,从所有年份的 Data_Value 中取最小的 Data_Value。我需要为每一天每月做这个。第 3 列:此列与上一列类似,但这里我需要最大值而不是最小值。

所以,我正在寻找的数据框应该是这样的:

Date      TMIN        TMAX
11-25      151        300
12-31      100        250
  .         .          .
  .         .          .

我正在使用 groupby:

per_day = df.Date.dt.to_period("D")
g_day = df.groupby(per_day)

在这里我可以使用g_day.min()g_day.max()所以我取同一天数据的最小值和最大值,这就是我卡住的地方,我只需要做同样的事情,但多年来(取同一对的最小值和最大值所有年份的日月)

我正在处理的数据可以在这里找到:https ://hub.coursera-notebooks.org/user/gksihrbikiyeqyhpwaxvrt/edit/data/C2A2_data/BinnedCsvs_d25/e696f3d79c6a540c6e6467eba0e59a9308653e877a41e5825451599f.csv

标签: python-3.xpandasdataframegroup-by

解决方案


我自己解决了,但答案是一团糟:

    data = pd.read_csv('data/C2A2_data/BinnedCsvs_d25/e696f3d79c6a540c6e6467eba0e59a9308653e877a41e5825451599f.csv')
    data.drop(labels=['ID','Unnamed: 4', 'Unnamed: 5','Unnamed: 6', 'Unnamed: 7', 'Unnamed: 8', 'Unnamed: 9'],axis=1,inplace=True)
    data['Date'] = pd.to_datetime(data['Date'],infer_datetime_format=True)
    data.sort_values(by='Date',inplace=True)

    per_day = data.Date.dt.to_period("D")
    g_day = data.groupby(per_day)
    T_min = g_day.min()
    T_max = g_day.max()
    T_min['Date'] = (T_min['Date']).astype('str').str.split('-').str.get(0)
    T_max['Date'] = (T_max['Date']).astype('str').str.split('-').str.get(0)

    df_min = pd.DataFrame()
    df_max = pd.DataFrame()
    for i in T_min['Date'].unique():
        df_min[i] = T_min[T_min['Date'] == i]['Data_Value'].reset_index(drop=True)
        df_max[i] = T_max[T_max['Date'] == i]['Data_Value'].reset_index(drop=True)

    min_2015 = df_min['2015']
    max_2015 = df_max['2015']
    df_min.drop(labels='2015',axis=1,inplace=True)
    df_max.drop(labels='2015',axis=1,inplace=True)
    df_min['min'] = df_min.min(axis=1)
    df_max['max'] = df_max.max(axis=1)

推荐阅读