可以对每行具有不同偏移量的日期算术进行向量化吗?

问题描述 投票:0回答:1

我有一个简单的函数

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
,只是想知道我们是否可以做得更好。

谢谢!

pandas python-datetime
1个回答
0
投票

原来 Pandas 有

MonthBegin
QuarterBegin
YearBegin
,它们可以满足我的需要。

© www.soinside.com 2019 - 2024. All rights reserved.