Изменение годовых дат на месячные и добавление новых значений для заполнения месячных дат - PullRequest
1 голос
/ 21 февраля 2020

У меня есть следующий фрейм данных

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..

Я хочу сделать это для каждого значения даты в кадре данных. Как лучше я могу это сделать?

1 Ответ

0 голосов
/ 21 февраля 2020

Используйте itertools.product для всех комбинаций лет с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...