想象一下,我有一个看起来像这样的数据框:
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"
答案 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