使用定义的频率(多列)填写分组依据中的缺失日期

时间:2019-02-01 23:40:44

标签: python pandas pandas-groupby

想象一下,我有一个看起来像这样的数据框:

ID      DATE         VALUE_1   Value_2 ...
1    31-01-2006        5         "USD"  
1    31-01-2007        5         "USD"
1    31-01-2008        10        "USD"
1    31-01-2011        11        "USD"
2    31-12-2006        5         "USD"
2    31-12-2007        5         "USD"
2    31-12-2008        5         "USD"
2    31-12-2009        5         "USD"

通过X更多的列。

如您所见,这是面板数据,在同一日期具有多个条目,且具有不同的ID。我要做的是为每个ID填写缺少的日期。你可以看到,ID为“1”出现在第二和第三项之间个月的跳跃。

我想要一个看起来像下面的数据框-请记住,我正在寻找一种解决方案,该解决方案适用于具有多个值列+30和许多ID(1000+)的数据框,并且仍然有效。也就是说,不应为ID已经“完整”的任何数据填充数据,这意味着它们已经具有数据指定的频率。在这种情况下,每年一次。但是请记住,即使它们每年一次,也不一定总是遵循日历年。

ID      DATE         VALUE_1   Value_2 ...
1    31-01-2006        5         "USD"  
1    31-01-2007        5         "USD"
1    31-01-2008        10        "USD"
1    31-01-2009        NA          NA
1    31-01-2010        NA          NA
1    31-01-2011        11        "USD"
2    31-12-2006        5         "USD"
2    31-12-2007        5         "USD"
2    31-12-2008        5         "USD"
2    31-12-2009        5         "USD"

1 个答案:

答案 0 :(得分:1)

这是一个完全灵活的解决方案:

def resample_custom_freq(data):
    """ Resample datetime using different time offsets """

    # Compute the offsets
    month = data['Month'][0] - 1
    day = data['Day'][0] - 1

    # Modify data
    data = data.resample('AS').last().drop('ID', axis=1).reset_index().reset_index()
    data.loc[:, 'DATE'] += pd.offsets.MonthOffset(month)
    data.loc[:, 'DATE'] += pd.offsets.DateOffset(day)
    return data

df['DATE'] =  pd.to_datetime(df['DATE'])
df['Month'] = df['DATE'].dt.month
df['Day'] = df['DATE'].dt.day
df.set_index('DATE', inplace=True, drop=True)
df_1 = df.groupby('ID').apply(resample_custom_freq).reset_index().drop(['level_1', 'index', 'Month', 'Day'], axis=1)

df_1
Out[264]: 
   ID       DATE  VALUE_1 Value_2
0   1 2006-01-31      5.0   "USD"
1   1 2007-01-31      5.0   "USD"
2   1 2008-01-31     10.0   "USD"
3   1 2009-01-31      NaN     NaN
4   1 2010-01-31      NaN     NaN
5   1 2011-01-31     11.0   "USD"
6   2 2006-12-31      5.0   "USD"
7   2 2007-12-31      5.0   "USD"
8   2 2008-12-31      5.0   "USD"
9   2 2009-12-31      5.0    "USD