将行从年值划分为月值 pandas
Divide rows from yearly to monthly values pandas
我正在尝试根据月份将具有开始日期和结束日期的订单项分成多行。
应根据特定月份的天数计算值。
例如1个订单项的数据:
id
StartDate
EndDate
Annual
abc
12/12/2018
01/12/2019
120,450
预期输出:
id
Month
Year
Monthly volume
abc
12
2018
6,600
abc
1
2019
10,230
abc
2
2019
9,240
abc
3
2019
10,230
abc
4
2019
9,900
abc
5
2019
10,230
abc
6
2019
9,900
abc
7
2019
10,230
abc
8
2019
10,230
abc
9
2019
9,900
abc
10
2019
10,230
abc
11
2019
9,900
下次你问的东西很少。
- 这是一个存在答案的案例,所以总是尝试 google
首先是减少重复。其他 post 在下面的代码中引用。
- 您还应该始终包括您已经尝试过的代码,所以不会
喜欢做功课,但我们会帮助你。
- 您应该包含一个更容易复制的数据框。我不应该像下面的代码那样复制粘贴来构建它。
- 您显然正在做一些事情来将年度总量转换为月度总量,但您没有对此进行解释,所以不要指望它会为您完成。
- 最后,此代码不会转换为单独的月份和年份列,但是一旦你有了日期,这对你来说应该是微不足道的(或者 google 如何去做)。
import pandas as pd
df = pd.DataFrame(
data = [['abc','12/12/2018','12/01/2019',120450]],
columns = ['id', 'startDate', 'EndDate', 'Annual']
)
df['startDate'] = pd.to_datetime(df['startDate'])
df['EndDate'] = pd.to_datetime(df['EndDate'])
# pd.bdate_range(start="2020/12/16", end="2020/12/26", freq="C", weekmask="Sat Sun")
# %%
df_start_end = df.melt(id_vars=['id', 'Annual'],value_name='date')
# credit to u/gen
#
df = (
df_start_end.groupby('id')
.apply(lambda x: x.set_index('date')
.resample('M').pad())
.drop(columns=['id','variable'])
.reset_index()
)
print(df)
我正在尝试根据月份将具有开始日期和结束日期的订单项分成多行。 应根据特定月份的天数计算值。
例如1个订单项的数据:
id | StartDate | EndDate | Annual |
---|---|---|---|
abc | 12/12/2018 | 01/12/2019 | 120,450 |
预期输出:
id | Month | Year | Monthly volume |
---|---|---|---|
abc | 12 | 2018 | 6,600 |
abc | 1 | 2019 | 10,230 |
abc | 2 | 2019 | 9,240 |
abc | 3 | 2019 | 10,230 |
abc | 4 | 2019 | 9,900 |
abc | 5 | 2019 | 10,230 |
abc | 6 | 2019 | 9,900 |
abc | 7 | 2019 | 10,230 |
abc | 8 | 2019 | 10,230 |
abc | 9 | 2019 | 9,900 |
abc | 10 | 2019 | 10,230 |
abc | 11 | 2019 | 9,900 |
下次你问的东西很少。
- 这是一个存在答案的案例,所以总是尝试 google 首先是减少重复。其他 post 在下面的代码中引用。
- 您还应该始终包括您已经尝试过的代码,所以不会 喜欢做功课,但我们会帮助你。
- 您应该包含一个更容易复制的数据框。我不应该像下面的代码那样复制粘贴来构建它。
- 您显然正在做一些事情来将年度总量转换为月度总量,但您没有对此进行解释,所以不要指望它会为您完成。
- 最后,此代码不会转换为单独的月份和年份列,但是一旦你有了日期,这对你来说应该是微不足道的(或者 google 如何去做)。
import pandas as pd
df = pd.DataFrame(
data = [['abc','12/12/2018','12/01/2019',120450]],
columns = ['id', 'startDate', 'EndDate', 'Annual']
)
df['startDate'] = pd.to_datetime(df['startDate'])
df['EndDate'] = pd.to_datetime(df['EndDate'])
# pd.bdate_range(start="2020/12/16", end="2020/12/26", freq="C", weekmask="Sat Sun")
# %%
df_start_end = df.melt(id_vars=['id', 'Annual'],value_name='date')
# credit to u/gen
#
df = (
df_start_end.groupby('id')
.apply(lambda x: x.set_index('date')
.resample('M').pad())
.drop(columns=['id','variable'])
.reset_index()
)
print(df)