在python中从每年到每月数据点外推完全相同的行

问题描述

我有每年粒度的示例数据框:

df = pd.DataFrame({
    "date": ["2020-01-01","2021-01-01","2022-01-01"],"cost": [100,1000,150],"person": ["Tom","Jerry","Brian"]
})

我想在没有任何估计方法的情况下创建具有每月粒度的数据帧(每年只需重复一行 12 次。因此,在这个 3 行数据帧的结果中,我希望得到 36 行完全像:

2020-01-01   /   100   /   Tom
2020-02-01   /   100   /   Tom
2020-03-01   /   100   /   Tom
2020-04-01   /   100   /   Tom
2020-05-01   /   100   /   Tom

[...]

2022-10-01   /   150   /   Brian
2022-11-01   /   150   /   Brian
2022-12-01   /   150   /   Brian

我试过了

df.resample('M',on = 'date').apply(lambda x:x)

但似乎无法让它工作......

我是初学者,请原谅我的无知 提前感谢您的帮助!

解决方法

这是一种方法。

count = len(df)
for var in df[['date','cost','person']].values:
    for i in range(2,13):
        df.loc[count] = [(var[0][0:5] + "{:02d}".format(i) + var[0][7:]),var[1],var[2]]
        count += 1

df = df.sort_values('date')
,

以下也应该有效,

#Typecasting
df['date'] = pd.to_datetime(df['date'])

#Making new dataframe based on frequency
op = pd.DataFrame(pd.date_range(start=df['date'].min(),end=df['date'].max()+pd.offsets.DateOffset(months=11),freq='MS'),columns = ['date'])

#merging both results on year using merge( with outer join)
res = pd.merge(df,op,left_on=df['date'].apply(lambda x: x.year),right_on = op['date'].apply(lambda x: x.year),how = 'outer')

#dropping key columns from left side
res.drop(['key_0','date_x'],axis=1,inplace=True)