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
我想将经期数据更改为每日数据。 我有以下数据:
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