Как сгруппировать данные по частям день-месяц в дате независимо от части года? - PullRequest
0 голосов
/ 06 мая 2018

У меня большой фрейм данных, первые 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) для данного дня-месяца, измеренное в упомянутом выше периоде, то есть для 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 / e696f3d79c6a540c6e6467eba0eeeeeeeeeeeeeeeeeeeeee.

1 Ответ

0 голосов
/ 12 мая 2018

Я решил это самостоятельно, но ответ беспорядок:

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