Python: 将周期更改为每日记录

Python: change periods to daily records

我想将经期数据更改为每日数据。 我有以下数据:

d = {'id_article': [1, 1, 2],
     'sale': [103963.00, 30000.00, 15000.00],
     'date_from': ['04-01-2022', '03-01-2022', '03-01-2022'],
     'date_to': ['15-01-2022', '28-02-2022', '23-01-2022']}

df = pd.DataFrame(data=d)

id_article  sale        date_from       date_to       days_in_between
1           103963.00   04-01-2022      15-01-2022    12
1           30000.00    03-01-2022      28-02-2022    57
2           15000.00    03-01-2022      23-01-2022    21

在我的最终结果中,我想获得每个月的总金额。 所以像这样:

id_article  sale          month     
1           119226,16     1
1           14736,84      2
2           15000         1

119226,16 = (103963/12)*12 + (30000/57)*29
14736,84 = (30000/57)*28
(total_sale/days_in_between) * days_from_period_in_month

我想我可以把这个df改成每日记录。我知道我可以使用 pd.date_range(start=start_date, end=end_date, freq="D") 来获得介于两者之间的天数,但是我不知道如何有效地应用它到数据框。 我想关注 df:

id_article  sale_daily    date      
1           8663,58       04-01-2022
1           8663,58       05-01-2022
1           8663,58       06-01-2022
1           8663,58       07-01-2022
1           8663,58       08-01-2022
1           8663,58       09-01-2022
1           8663,58       10-01-2022
1           8663,58       11-01-2022
1           8663,58       12-01-2022
1           8663,58       13-01-2022
1           8663,58       14-01-2022
1           8663,58       15-01-2022
1           526,32        03-01-2022
1           526,32        04-01-2022
1           526,32        05-01-2022
1           526,32        06-01-2022
1           526,32        07-01-2022
1           526,32        08-01-2022
...         ...           ...      
1           526,32        24-02-2022
1           526,32        25-02-2022
1           526,32        26-02-2022
1           526,32        27-02-2022
1           526,32        28-02-2022
2           714,29        03-01-2022
2           ...           ...

其中 sale_daily 是销售额除以中间的天数。稍后我将从日期中提取月份,并按 id_article 和月份汇总。 您能帮忙获取每日数据吗?或者有其他方法可以获取给定期间的月销售额吗?

尝试:

#convert if necessary:
#df["date_from"] = pd.to_datetime(df["date_from"], format="%d-%m-%Y")
#df["date_to"] = pd.to_datetime(df["date_to"], format="%d-%m-%Y")

df["month"] = df.apply(
    lambda x: pd.date_range(x["date_from"], x["date_to"]),
    axis=1,
)
df["sale"] = df.apply(lambda x: x["sale"] / x["month"].size, axis=1)

df = df.explode("month")
out = (
    df.groupby([df["id_article"], df.month.dt.month])["sale"]
    .sum()
    .reset_index()
)
print(out)

打印:

   id_article  month           sale
0           1      1  119226.157895
1           1      2   14736.842105
2           2      1   15000.000000