我有一个简单的函数
get_start_of_period
,它接受日期并返回该时期的开始时间。看起来如下:
import datetime as dt
from dateutil.relativedelta import relativedelta
from typing import Literal
def get_start_of_period(date: dt.date, term_length: Literal[1, 3, 12]) -> dt.date:
months_in_period = (date.month - 1) % term_length
return date - relativedelta(day=1, months=months_in_period)
此函数接受任何输入日期并将其转换为月初、季度或年份,具体取决于
term_length
参数:
>>> curr_date = dt.date(2024, 6, 7)
>>> get_start_of_period(curr_date, term_length=1)
datetime.date(2024, 6, 1)
>>> get_start_of_period(curr_date, term_length=3)
datetime.date(2024, 4, 1)
>>> get_start_of_period(curr_date, term_length=12)
datetime.date(2024, 1, 1)
我有一个 Pandas 系列日期,我想以这种方式将其转换为各自周期的开始。您可以假设
term_length
在整个系列中保持不变。有没有办法矢量化该转换?目前我只是把它写成 series.apply(lambda curr_date: get_start_of_period(curr_date, term_length=1)
但我想知道我是否可以改进它。
pd.DateOffset
似乎只接受常量,而 pd.Timedelta
不采用月级粒度。 numpy 支持 timedelta64[M]
对象,但行为看起来很奇怪 - 添加 1 个月的增量会增加 30 天,而添加 n > 1
月会增加两个月减去一天。
我在网上看到的大多数解决方案似乎都使用
apply
,只是想知道我们是否可以做得更好。
谢谢!