您可以将列转换为季度期间,对于小计,按DatetimeIndex.to_period
转换为季度期间;对于正确的顺序,按concat
转换为原始期间,按DataFrame.sort_index
转换为季度期间:
df.columns = pd.to_datetime(df.columns)
out = (pd.concat([df,
df.groupby(df.columns.to_period('Q'), axis=1).sum()],
axis=1)
.sort_index(axis=1, key=lambda x: pd.PeriodIndex(x, 'Q')))
out.columns = [x.strftime("Q%q'%y") if isinstance(x, pd.Period)
else x for x in out.columns]
print (out)
2024-03-01 00:00:00 Q1'24 2024-04-01 00:00:00 2024-05-01 00:00:00 \
part
part1 6 6 8 2
part2 7 7 1 3
part3 10 10 7 4
part4 6 6 9 3
part5 2 2 1 10
part6 1 1 0 4
2024-06-01 00:00:00 Q2'24 2024-07-01 00:00:00 2024-08-01 00:00:00 \
part
part1 3 13 0 5
part2 8 12 9 4
part3 5 16 6 10
part4 0 12 10 9
part5 8 19 7 3
part6 1 5 1 7
2024-09-01 00:00:00 Q3'24
part
part1 5 10
part2 10 23
part3 0 16
part4 10 29
part5 3 13
part6 8 16
好点—在上一个版本的pandas(2.1.4+)需要转置,谢谢你@ nick:
df.columns = pd.to_datetime(df.columns)
df = df.T
out = (pd.concat([df,
df.groupby(df.index.to_period('Q')).sum()]).T
.sort_index(axis=1, key=lambda x: pd.PeriodIndex(x, 'Q'))
)
out.columns = [x.strftime("Q%q'%y")
if isinstance(x, pd.Period)
else x for x in out.columns]
print (out)
2024-03-01 00:00:00 Q1'24 2024-04-01 00:00:00 2024-05-01 00:00:00 \
part
part1 6 6 8 2
part2 7 7 1 3
part3 10 10 7 4
part4 6 6 9 3
part5 2 2 1 10
part6 1 1 0 4
2024-06-01 00:00:00 Q2'24 2024-07-01 00:00:00 2024-08-01 00:00:00 \
part
part1 3 13 0 5
part2 8 12 9 4
part3 5 16 6 10
part4 0 12 10 9
part5 8 19 7 3
part6 1 5 1 7
2024-09-01 00:00:00 Q3'24
part
part1 5 10
part2 10 23
part3 0 16
part4 10 29
part5 3 13
part6 8 16