Python 将年度日期更改为月度日期,并添加新值以填充月度日期
我有以下数据帧Python 将年度日期更改为月度日期,并添加新值以填充月度日期,python,pandas,dataframe,datetimeindex,Python,Pandas,Dataframe,Datetimeindex,我有以下数据帧 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 然后我将date列更改为datetime索引 data['da
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
然后我将date列更改为datetime索引
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..
我想对数据框中的每个日期值执行此操作。我如何才能最好地做到这一点?用于所有年份的组合,并按原始版本列出所有行:
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]
})
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
日期有效,但我希望1年的值除以12。因此,1989年的价值是11558522。我想把这个值除以12,然后这将是填充当年月份的新值。i、 e 1988-01-01至1988-12-01的值为889117。077@Tamarie-我认为第一个解决方案过于复杂,因此添加了更简单的解决方案,如果我在我的数据集
TypeError上尝试,还存在12除法得到以下错误:开始和结束不能同时在不同的时区感知tz
@Tamarie-添加了原始解决方案,只增加了12的除法,不工作。仍然得到我前面提到的类型错误。如果我尝试您给出的第一个示例,我会得到以下错误:错误:无法汇编日期时间:时间数据“-1661174702541897627”与格式“%Y%m%d”(匹配)工作的日期不匹配,但我希望1年的值除以12。因此,1989年的价值是11558522。我想把这个值除以12,然后这将是填充当年月份的新值。i、 e 1988-01-01至1988-12-01的值为889117。077@Tamarie-我认为第一个解决方案过于复杂,因此添加了更简单的解决方案,如果我在我的数据集TypeError上尝试,还存在12除法得到以下错误:开始和结束不能同时在不同的时区感知tz
@Tamarie-添加了原始解决方案,只增加了12的除法,不工作。仍然得到我前面提到的类型错误。如果我尝试您给出的第一个示例,我会得到以下错误:错误:无法汇编日期时间:时间数据“-1661174702541897627”与格式“%Y%m%d”(匹配)