изменить и сгенерировать новые данные даты в панде - PullRequest
1 голос
/ 26 июня 2019

У меня есть padas dataframe:

import pandas as pd
import numpy as np
d={'ID':['A1','A1','A2','A2','A2'], 'date':['Jan 1','Jan7','Jan4','Jan5','Jan12'],'value':[10,12,3,5,2]}
df=pd.DataFrame(data=d)
df

    ID  date    value
0   A1  Jan 1   10
1   A1  Jan7    12
2   A2  Jan4    3
3   A2  Jan5    5
4   A2  Jan12   2
...
An

Я бы хотел изменить его так, чтобы столбец даты стал основным столбцом, начиная от min(date) до max(date) последовательно (в данном случае 1 январядо 12 января).Каждый дополнительный столбец будет иметь отдельный идентификатор, а значения будут соответствовать соответствующим датам.Я также хотел бы «заполнить» пробелы np.linspace(value at first date, value at next date, number of days), и любая дата от первой даты до первой записи остается постоянной.

В конце мне бы хотелось:

f={'date':['Jan1','Jan2','Jan3','Jan4','Jan5','Jan6','Jan7','Jan8','Jan9','Jan10','Jan11','Jan12'],
  'A1':[10,10.3,10.7,11,11.3,11.7,12,12,12,12,12,12],
  'A2':[3,3,3,3,5,4.6,4.1,3.7,3.3,2.9,2.4,2]}
df2=pd.DataFrame(data=f)
df2

    date    A1      A2 ... An
0   Jan1    10.0    3.0
1   Jan2    10.3    3.0
2   Jan3    10.7    3.0
3   Jan4    11.0    3.0
4   Jan5    11.3    5.0
5   Jan6    11.7    4.6
6   Jan7    12.0    4.1
7   Jan8    12.0    3.7
8   Jan9    12.0    3.3
9   Jan10   12.0    2.9
10  Jan11   12.0    2.4
11  Jan12   12.0    2.0

Я пытался использовать numpy.linspace для генерации последовательности, но когда я пытаюсь добавить дополнительные значения, я не получаю значения:

A2 = [np.linspace(10,12,10)].append([[12]*4])

и

np.linspace(10,12,8).append([[12]*5])

дает мне:

AttributeError: 'numpy.ndarray' object has no attribute 'append'

Я думал о том, чтобы пройтись по определенным элементам, но не знаю, как объединить все это вместе в конце.

Любые предложения.

1 Ответ

2 голосов
/ 26 июня 2019

IIUC, это pivot и interpolate:

df['date'] = pd.to_datetime(df['date'], format='%b%d')

(df.pivot(index='date', columns='ID',values='value')
   .asfreq('D')
   .interpolate()
   .bfill()
   .reset_index()
)

Выход:

ID       date         A1        A2
0  1900-01-01  10.000000  3.000000
1  1900-01-02  10.333333  3.000000
2  1900-01-03  10.666667  3.000000
3  1900-01-04  11.000000  3.000000
4  1900-01-05  11.333333  5.000000
5  1900-01-06  11.666667  4.571429
6  1900-01-07  12.000000  4.142857
7  1900-01-08  12.000000  3.714286
8  1900-01-09  12.000000  3.285714
9  1900-01-10  12.000000  2.857143
10 1900-01-11  12.000000  2.428571
11 1900-01-12  12.000000  2.000000

Примечание , которое вы хотите преобразовать в datetime, так как вы будете интерполировать значения.

Если вы решите преобразовать его обратно, вы можете использовать:

df.index = df.index.strftime('%b%d')

Выход:

ID            A1        A2
Jan01  10.000000  3.000000
Jan02  10.333333  3.000000
Jan03  10.666667  3.000000
Jan04  11.000000  3.000000
Jan05  11.333333  5.000000
Jan06  11.666667  4.571429
Jan07  12.000000  4.142857
Jan08  12.000000  3.714286
Jan09  12.000000  3.285714
Jan10  12.000000  2.857143
Jan11  12.000000  2.428571
Jan12  12.000000  2.000000
...