将行从年值划分为月值 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)