重新采样Pandas中的时间序列数据使用先前数据填充Nans

时间:2017-06-23 15:09:25

标签: python time-series

我有一些时间序列数据,大部分是季度数据,但是以多个变量和多个国家/地区的年 - 月 - 日格式报告,但某些日期的某些变量是在本季度的最后一天发布的,其他变量可能会发布接近最后一天。我想执行一个重新采样,将每行聚合到频率的四分之一。我有这个:

Date          Country Var1 Var2 Var3
2012-03-30    China   12   Nan   200
2012-03-31    China   Nan  50    Nan
2012-06-28    China   13   Nan   199
2012-06-30    China   Nan  48    Nan
2012-09-30    China   13   49    200
2012-12-31    China   12   50    201

我想看到的是

Date          Country Var1 Var2 Var3
2012-03-31    China   12   50    200
2012-06-30    China   13   48    199
2012-09-30    China   13   49    200
2012-12-31    China   12   50    201

我尝试了几种不同的重采样想法。首先我试过

    df=df.groupby("Country").resample('Q').applymap(lambda x: df.shift(1) if math.isnan(x) else x)

然后我尝试将所有Nans转换为零然后通过sum进行聚合,但这并不理想,因为我无法跟踪哪些数据实际为零以及哪些数据丢失。

    df=df.fillna(0) 
    df=df.groupby("Country").resample('Q').sum()

1 个答案:

答案 0 :(得分:0)

这是一个小例子,我自己的数据框做你想要的。

# creating the dataframe
df = pd.DataFrame(np.random.randn(8, 3), columns=['Var1', 'Var2', 'Var3'])

# adding NaN values
df.iloc[1]['Var1'] = np.nan
df.iloc[5]['Var1'] = np.nan

df.iloc[4]['Var2'] = np.nan
df.iloc[6]['Var2'] = np.nan

df

'''
    Var1        Var2        Var3
0   -0.437551   -2.707623   0.726240
1   NaN         2.529733    0.484732
2   0.199278    -0.316516   -0.655426
3   0.732910    -0.638045   -0.706436
4   0.877915    NaN         -1.141384
5   NaN         -2.050228   2.091994
6   -1.119849   NaN         1.222602
7   0.406632    -2.255687   0.742452
'''

# backfilling values in Var2
df['Var2'] = df['Var2'].fillna(method='backfill').dropna()

# dropping NaN rows based on column Var1
df.dropna()

df

'''
    Var1        Var2        Var3
0   -0.437551   -2.707623   0.726240
2   0.199278    -0.316516   -0.655426
3   0.732910    -0.638045   -0.706436
4   0.877915    -2.050228   -1.141384
6   -1.119849   -2.255687   1.222602
7   0.406632    -2.255687   0.742452
'''