将年度日期更改为每月日期并添加新值以填充每月日期

Changing yearly dates to monthly dates and adding new values to populate monthly dates

我有以下数据框

data = pd.DataFrame({
'date': [1988, 1989, 1990, 1991],
'value': [11558522, 12323552, 13770958, 18412280]
}) 

Out[1]: 
   date     value
0  1988  11558522
1  1989  12323552
2  1990  13770958
3  1991  18412280

然后我将日期列更改为日期时间索引

data['date'] = pd.to_datetime(data['date'],format = '%Y')

Out[2]: 
        date     value
0 1988-01-01  11558522
1 1989-01-01  12323552
2 1990-01-01  13770958
3 1991-01-01  18412280

我把日期列设置为索引

data = data.set_index('date')

Out[3]: 

date          value      
1988-01-01  11558522
1989-01-01  12323552
1990-01-01  13770958
1991-01-01  18412280

现在我想获取一个日期值,即 1988 年并创建月份(01 到 12),然后获取该日期的值 (11558522) 并将其划分为 12 个月。 所以最终我希望数据集看起来像这样

    date          value      
1988-01-01  889117.077
1988-02-01  889117.077
1988-03-01  889117.077
1988-04-01  889117.077
      ...
1988-12-01  889117.077
1989-01-01  947965.538
1989-02-01  947965.538
1989-03-01  947965.538
1989-04-01  947965.538
      ...
1989-12-01  947965.538
etc..

我想为数据框中的每个日期值执行此操作。我怎样才能做到最好?

使用所有行中的 itertools.product for all combinations of years with DataFrame.merge 行:

data = pd.DataFrame({
'date': [1988, 1989, 1990, 1991],
'value': [11558522, 12323552, 13770958, 18412280]
}) 

from  itertools import product

y = data['date']
m = np.arange(1,13)
d = [1]

cols = ['year','month','day']
df = (pd.DataFrame(list(product(y, m, d)), columns=cols)
        .merge(data.rename(columns={'date':'year'}))
        .assign(value = lambda x: x['value'] / 12))

df = df.set_index(pd.to_datetime(df[cols])).drop(cols, axis=1)
print (df.head())
                    value
1988-01-01  963210.166667
1988-02-01  963210.166667
1988-03-01  963210.166667
1988-04-01  963210.166667
1988-05-01  963210.166667

另一个想法是使用字典映射的列 value 的值创建系列:

data = pd.DataFrame({
'date': [1988, 1989, 1990, 1991],
'value': [11558522, 12323552, 13770958, 18412280]
}) 


from  itertools import product

di = data.set_index('date')['value'].to_dict()
y = data['date']
m = np.arange(1,13)

comp = {f'{y}-{m}-01': di.get(y) for y,m,d in product(y, m, d)}
df = pd.Series(comp).div(12).to_frame('value')
df.index = pd.to_datetime(df.index)
print (df.head())
                    value
1988-01-01  963210.166667
1988-02-01  963210.166667
1988-03-01  963210.166667
1988-04-01  963210.166667
1988-05-01  963210.166667