Групповой год и месяц в datetime в Pandas - PullRequest
0 голосов
/ 29 марта 2019

Я экспортирую месяц из столбца datetime.

Мои данные следующие:

+--------------+----------------+
| Payment Date | Payable Amount |
+--------------+----------------+
| 2016/5/31    |             20 |
| 2016/5/28    |             50 |
| 2016/5/21    |             70 |
| 2016/5/20    |             10|
| 2016/5/15    |             150|
+--------------+----------------+

Я пробовал со следующим кодом:

data.groupby([data['Payment Date'].dt.year,data['Payment Date'].dt.month])['Payable Amount'].sum()

Что дает вывод в виде следующих столбцов:

Год

месяц

Сумма

Обратите внимание, что я пробовал использовать pd.Grouper ('M), который выдает ошибку как действительную только для DatetimeIndex, TimedeltaIndex или PeriodIndex, но получил экземпляр Float64Index

Я ожидаю такого результата.

+--------------+----------------+
| Payment Date | Payable Amount |
+--------------+----------------+
| 2016/5/1    |             300 |
| 2016/6/1    |             400 |
| 2016/7/1    |             500 |
| 2016/8/1    |             550 |
| 2016/9/1    |             600 |
+--------------+----------------+

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Используйте groupby, указав в поле «Дата платежа» начало месяца:

(data.groupby(df['Payment Date'] - pd.offsets.MonthBegin(1))['Payable Amount']
     .sum()
     .reset_index())

  Payment Date  Payable Amount
0   2016-05-01             300

Вычитание с объектом смещения предназначено для получения даты начала этого месяца:

df['Payment Date'] - pd.offsets.MonthBegin(1)

0   2016-05-01
1   2016-05-01
2   2016-05-01
3   2016-05-01
4   2016-05-01
Name: Payment Date, dtype: datetime64[ns]
0 голосов
/ 29 марта 2019

Grouper должен работать при условии, что в столбце Дата платежа указан тип даты и времени .Демо:

t = '''Payment Date | Payable Amount
2016/5/31    |             20
2016/5/28    |             30
2016/5/21    |             40
2017/5/20    |             50
2017/5/15    |             60'''

t = re.sub(r'[ \t]+\|[ \t]+', ',', t)


df = pd.read_csv(io.StringIO(t), parse_dates=['Payment Date'])

print(df)

выходы:

  Payment Date  Payable Amount
0   2016-05-31              20
1   2016-05-28              30
2   2016-05-21              40
3   2017-05-20              50
4   2017-05-15              60

Тогда:

df.groupby(pd.Grouper(key='Payment Date', freq='MS')).sum()

выходы:

              Payable Amount
Payment Date                
2016-05-01                90
2016-06-01                 0
2016-07-01                 0
2016-08-01                 0
2016-09-01                 0
2016-10-01                 0
2016-11-01                 0
2016-12-01                 0
2017-01-01                 0
2017-02-01                 0
2017-03-01                 0
2017-04-01                 0
2017-05-01               110
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...