gpt4 book ai didi

python - 条件重采样 - Pandas

转载 作者:太空宇宙 更新时间:2023-11-03 14:11:44 24 4
gpt4 key购买 nike

我有一种情况,我想根据契约(Contract)开始日期、结束日期和总支出来计算每日支出。下一步是按月汇总每日支出金额。这非常简单,稍后我将展示我如何完成。然而,还有另一个日期(inv date);如果开始inv date之前,则应将inv date之前的所有每日金额相加并包含在与相同的期间内库存日期

首先,简单的部分

df = pd.DataFrame({'start': ['1/1/2018'], 
'end': ['3/15/2018'],
'inv date': ['2/1/2018'],
'spend': [400]})


start end inv date spend
0 1/1/2018 3/15/2018 2/1/2018 400

创建契约(Contract)的日期范围

prd = pd.period_range(df.loc[0, 'start'], df.loc[0, 'end'], freq='D')
prd = pd.Series(1, prd) # empty series to get the number of days in the monthly period
prd = prd.resample('M').size() * (df.loc[0, 'spend'] / prd.resample('M').size().sum())

这给了我以下系列:按月分配的总支出,基于该月的天数......到目前为止,一切顺利。

prd

2018-01 167.567568
2018-02 151.351351
2018-03 81.081081
Freq: M, dtype: float64

困难的部分(对我来说)

正如我上面提到的,根据inv date,该系列实际上应该如下所示:

2018-01             0 
2018-02 318.918919
2018-03 81.081081
Freq: M, dtype: float64

因为inv datestart 日期之后,所以我不想在inv date 之后添加它。 仅供引用:318 = 167 + 151(即上述 2/2018 的总数)。

这可以通过重新采样实现吗?如果没有,最有效的方法是什么?

最佳答案

从“简单部分”部分末尾的 dfprd 开始:

# Get the inv date as a pandas Timestamp
invdate = pd.to_datetime(df['inv date'])[0]
oneday = pd.offsets.Day(1)
# Pandas slicing includes BOTH endpoints, so we need this one-day
# offset to get all values strictly before the inv date
prd.loc[invdate] = prd[invdate] + prd[:invdate - oneday].sum()
prd.loc[:invdate - oneday] = 0

# output
2018-01 0.000000
2018-02 318.918919
2018-03 81.081081
Freq: M, dtype: float64

关于python - 条件重采样 - Pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48453212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com