Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将年度日期更改为月度日期,并添加新值以填充月度日期_Python_Pandas_Dataframe_Datetimeindex - Fatal编程技术网

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”(匹配)