看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在时序数据分析过程中,比如财务分析中,需要统计两个日期之间的季度信息,pandas 的时序分析是非常强大的,本例我们就来看看如何操作这类数据。
我们的数据如下,每行数据有一个开始时间和结束时间:
import pandas as pd
data = {'start': ['2022-12-01', '2023-01-01', '2023-01-01'],
'end': ['2023-01-01', '2024-05-01', '2023-07-01']}
df = pd.DataFrame(data, dtype='datetime64[ns]')
df
'''
start end
0 2022-12-01 2023-01-01
1 2023-01-01 2024-05-01
2 2023-01-01 2023-07-01
'''
现在需要统计两个时间之间有几个完整的季度,这个季度是日历上的季度,而不是只要三个月就认为是一个季度。另外,如果时间区间在一个日历季度中不完整,则不计算季度数。
源数据的日期已经类型了,我们将它们全部转为周期(Period)对象,然后两列周期进行相减,会得到时间偏移,然后计算有多少个季度为单个时间偏移即可得到结果。
将时间转为季度周期:
df.apply(lambda s: s.dt.to_period('Q'))
'''
start end
0 2022Q4 2023Q1
1 2023Q1 2024Q2
2 2023Q1 2023Q3
'''
每一个元素都是一个 Period 对象,接下来我们将两列相减:
(
df.apply(lambda s: s.dt.to_period('Q'))
.pipe(lambda d: d.end - d.start)
)
'''
0 <QuarterEnd: startingMonth=12>
1 <5 * QuarterEnds: startingMonth=12>
2 <2 * QuarterEnds: startingMonth=12>
dtype: object
'''
得到的数据是时间偏移(季度末)类型。最后,我们再读取它们的属性 n,就得到了完整季度数:
(
df.apply(lambda s: s.dt.to_period('Q'))
.pipe(lambda d: d.end - d.start)
.apply(lambda x: x.n)
)
'''
0 1
1 5
2 2
dtype: int64
'''
这样就计算到了结果。
(完)
更新时间:2024-08-18 16:18:21 标签:pandas python 季度 日期