我正在从日期时间列中导出月份。
我的数据如下:
+--------------+----------------+
| 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 |
+--------------+----------------+
答案 0 :(得分:1)
使用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]
答案 1 :(得分:0)
如果付款日期列的日期时间类型为,石斑鱼应该可以工作。演示:
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