如何按日期的日期部分对数据进行分组,而不考虑年份部分?

时间:2018-05-06 01:40:11

标签: python-3.x pandas dataframe group-by

我有一个大数据框,其前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

这些数据是最低和最高温度的每日测量值(TMIN
 &安培; TMAX)在2005-2014期间,同一日期有几个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

1 个答案:

答案 0 :(得分:0)

我自己解决了,但答案很糟糕:

    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)