我试图避免使用 DateTimeIndex 的 for 循环。我有一个函数
get_latest
可以查找最新的工资指数值。当我遍历发薪日的日期时,查找工作正常。当我尝试对操作进行矢量化时,有人建议我TypeError: 'numpy.ndarray' object is not callable
。我已经尝试了 dt、date、to_pydatetime 等各种方式,但均无济于事。
# %%
import pandas as pd
import datetime
# %%
def get_latest(date, series):
return series.loc[max([x for x in series.index if x <= date])]
# %%
start_rate = 1000.0
start = '2025-08-01'
end = '2026-02-01'
raise_series = pd.Series ({
datetime.date(2024, 10, 1) : 0.06,
datetime.date(2025, 10, 1) : 0.05,
datetime.date(2026, 1, 1) : 1.055,
datetime.date(2026, 10, 1) : 0.04,
datetime.date(2027, 10, 1) : 0.04,
datetime.date(2028, 10, 1) : 0.04,
datetime.date(2029, 10, 1) : 0.04
})
# %%
initial_index = pd.Series ({
datetime.date(1, 1, 1): 0.00
})
index_series = pd.concat([initial_index, raise_series], axis=0)
index_series += 1
index_series = index_series.cumprod()
# %%
pay_days = pd.date_range(start=start, end=end, freq='2W')
# %%
gross = []
for row in pay_days:
gross.append(get_latest(row.date(), index_series) * start_rate)
pay_days_gross1 = pd.Series(gross)
# %%
pay_days_gross2 = get_latest(pay_days.date(), index_series) * start_rate
# %%```
这是一种方法:
pay_days_gross = (raise_series.add(1)
.cumprod()
.reindex(pay_days,
method='ffill',
fill_value=1)
.mul(start_rate)
)
输出:
2025-08-03 1060.000
2025-08-17 1060.000
2025-08-31 1060.000
2025-09-14 1060.000
2025-09-28 1060.000
2025-10-12 1113.000
2025-10-26 1113.000
2025-11-09 1113.000
2025-11-23 1113.000
2025-12-07 1113.000
2025-12-21 1113.000
2026-01-04 2287.215
2026-01-18 2287.215
2026-02-01 2287.215
Freq: 2W-SUN, dtype: float64
解释/中间体
Series.add
添加 1
,将百分比转化为乘数,并使用 Series.cumprod
计算其随时间的累积效应。raise_series.add(1).cumprod()
2024-10-01 1.060000
2025-10-01 1.113000
2026-01-01 2.287215
2026-10-01 2.378704
2027-10-01 2.473852
2028-10-01 2.572806
2029-10-01 2.675718
dtype: float64
Series.reindex
与 pay_days
一起使用,如果 method='ffill'
早于 fill_value=1
中的第一个日期,则使用 1
向前填充值,使用 start
将乘数设置为 raise_series
。start_rate
与Series.mul
。