重塑并在pandas数据框中生成新的日期数据

时间:2019-06-26 20:20:48

标签: pandas dataframe reshape

我有一个熊猫数据框:

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

我想对其进行调整,以使date列成为主列,顺序从min(date)max(date)(在本例中为Jan 1到Jan 12)。每个额外的列将是一个单独的ID,其值将对应于相应的日期。 我还想用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 个答案:

答案 0 :(得分:2)

IIUC,分别是pivotinterpolate

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

请注意,因为要对值进行插值,所以要转换为日期时间。

如果您选择将其转换回去,则可以使用:

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