Как разделить DateTime на год и месяц при суммировании значений?

#python #pandas #datetime #dataframe

#python #pandas #datetime #dataframe

Вопрос:

У меня есть фрейм данных со столбцом даты в качестве индекса в качестве типа DateTime и значением, прикрепленным к каждой записи.

Даты разделяются на гггг-мм-дд, причем каждая строка соответствует следующему дню.

Пример:

 Date:          x:
2012-01-01     44
2012-01-02     75
2012-01-03     62
  

Как бы я разделил столбец Date на столбцы Year и Month, используя эти два в качестве индексов, а также суммируя значения всех дней в месяце?

Пример ожидаемого результата:

 Year:     Month:     x:
2012      1          745
          2          402
          3          453
...
2013      1          4353
  

Ответ №1:

Используйте Series.dt.year
Series.dt.month с aggregate sum by GroupBy.sum и rename для имен новых столбцов:

 df['Date'] = pd.to_datetime(df['Date'])

df1 = df.groupby([df['Date'].dt.year.rename('Year'),
                  df['Date'].dt.month.rename('Month')])['x'].sum().reset_index()
print (df1)
   Year  Month    x
0  2012      1  181
  

Ответ №2:

Используйте groupby и sum :

 (df.groupby([df.Date.dt.year.rename('Year'), df.Date.dt.month.rename('Month')])['x']
   .sum())

Year  Month
2012  1        181
Name: x, dtype: int64
  

Обратите внимание, что если «Date» не является столбцом datetime dtype, используйте

 df.Date = pd.to_datetime(df.Date, errors='coerce')
  

Сначала преобразовать его.


 (df.groupby([df.Date.dt.year.rename('Year'), df.Date.dt.month.rename('Month')])['x']
   .sum()
   .reset_index())

   Year  Month    x
0  2012      1  181