将缺少的日期转发到Python Pandas Dataframe

时间:2018-09-20 18:08:45

标签: python pandas dataframe

我有一个熊猫的数据框,其填充如下:

ref_date    tag
1/29/2010   1
2/26/2010   3
3/31/2010   4
4/30/2010   4
5/31/2010   1
6/30/2010   3
8/31/2010   1
9/30/2010   4
12/31/2010  2

请注意数据中缺少的月份(即7、10、11)。我想通过正向填充方法来填充丢失的数据,使其看起来像这样:

ref_date    tag
1/29/2010   1
2/26/2010   3
3/31/2010   4
4/30/2010   4
5/31/2010   1
6/30/2010   3
7/30/2010   3
8/31/2010   1
9/30/2010   4
10/29/2010  4
11/30/2010  4
12/31/2010  2

缺少日期的标签将具有上一个日期的标签。所有日期均表示该月的最后一个工作日

这是我试图做的:

idx = pd.date_range(start='1/29/2010', end='12/31/2010', freq='BM')
df.ref_date.index = pd.to_datetime(df.ref_date.index)
df = df.reindex(index=[idx], columns=[ref_date], method='ffill')

这给了我错误:

  

TypeError:无法将类型'时间戳'与类型'int'

其中pd是熊猫,df是数据帧。

我是Pandas Dataframe的新手,所以我们将不胜感激!

2 个答案:

答案 0 :(得分:1)

您非常接近,您只需使用ref_date设置数据框的索引,在方法中指定ffill时将其重新索引为工作日月末索引,然后重置索引并重命名回到原来:

# First ensure the dates are Pandas Timestamps.
df['ref_date'] = pd.to_datetime(df['ref_date'])

# Create a monthly index.
idx_monthly = pd.date_range(start='1/29/2010', end='12/31/2010', freq='BM')

# Reindex to the daily index, forward fill, reindex to the monthly index.
>>> (df
     .set_index('ref_date')
     .reindex(idx_monthly, method='ffill')
     .reset_index()
     .rename(columns={'index': 'ref_date'}))
     ref_date  tag
0  2010-01-29  1.0
1  2010-02-26  3.0
2  2010-03-31  4.0
3  2010-04-30  4.0
4  2010-05-31  1.0
5  2010-06-30  3.0
6  2010-07-30  3.0
7  2010-08-31  1.0
8  2010-09-30  4.0
9  2010-10-29  4.0
10 2010-11-30  4.0
11 2010-12-31  2.0

答案 1 :(得分:0)

感谢上一个回答此问题但删除了答案的人。我找到了解决方案:

df[ref_date] = pd.to_datetime(df[ref_date])
idx = pd.date_range(start='1/29/2010', end='12/31/2010', freq='BM')
df = df.set_index(ref_date).reindex(idx).ffill().reset_index().rename(columns={'index': ref_date})