【问题标题】:Resampling Time Series Data in Pandas Fill Nans with Previous Data在 Pandas 中重新采样时间序列数据用以前的数据填充 Nans
【发布时间】:2017-11-27 05:27:50
【问题描述】:

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

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 转换为零,然后按总和进行聚合,但这并不理想,因为我无法跟踪哪些数据实际上为零以及哪些数据丢失。

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

【问题讨论】:

  • 我的回答对你有用吗?

标签: python pandas time-series


【解决方案1】:

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

# 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
'''

【讨论】:

  • 这会起作用,除了一些我想回填的列和其他我想向前填充并且每个季度有一个观察结果的列。有效的方法实际上只是使用 resample 到季度结束频率,聚合函数为 max 或 min,它忽略了 Nans,无论是在季度的最后一天还是前几天,都进行了观察,并且将其分配到季度末。现在我的所有行都是 3/31/YY、6/30/YY、9/30/YY、12/31/YY,而不是某些行 3/28/YY、6/29/YY 等跨度>
猜你喜欢
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 2016-11-02
  • 2019-01-18
  • 1970-01-01
相关资源
最近更新 更多