将年度日期更改为每月日期并添加新值以填充每月日期
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
我有以下数据框
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