2017-01-12 57 views
1

我有一个看起来像这样,每月的数据点的数据帧:重建索引蟒蛇数据帧创建NaN值

Date  Value 
1 2010-01-01 18.45 
2 2010-02-01 18.13 
3 2010-03-01 18.25 
4 2010-04-01 17.92 
5 2010-05-01 18.85 

我想让它每天的数据,并与当前所产生的新日期填写月价值。例如:

Date  Value 
1 2010-01-01 18.45 
2 2010-01-02 18.45 
3 2010-01-03 18.45 
4 2010-01-04 18.45 
5 2010-01-05 18.45 
.... 

这是我使用添加的临时日期,并填写值码:

today = get_datetime('US/Eastern') #.strftime('%Y-%m-%d') 
enddate='1881-01-01' 
idx = pd.date_range(enddate, today.strftime('%Y-%m-%d'), freq='D') 
df = df.reindex(idx) 
df = df.fillna(method = 'ffill') 

输出如下:

     Date Value 
2010-01-01 00:00:00 NaN NaN 
2010-01-02 00:00:00 NaN NaN 
2010-01-03 00:00:00 NaN NaN 
2010-01-04 00:00:00 NaN NaN 
2010-01-05 00:00:00 NaN NaN 

日志显示NaN值恰好在.fillna方法被调用之前出现。所以前锋并不是罪魁祸首。

任何想法为什么会发生这种情况?

回答

1

你需要每月通话重新索引

test = pd.DataFrame(np.random.randn(4), index=pd.date_range('2017-01-01', '2017-01-04'), columns=['test']) 
test.reindex(pd.date_range('2017-01-01', '2017-01-05'), method='ffill') 
2

选项3
最保险的做法,很一般
上采样到日常,然后组的变换前索引添加到原数据帧

这个重要的原因是,你的一天可能不会在本月的第一个月。如果你想确保该天值获取隔日月播出,为此

df.set_index('Date').asfreq('D') \ 
    .groupby(pd.TimeGrouper('M')).Value \ 
    .transform('first').reset_index() 

选项2
asfreq

df.set_index('Date').asfreq('D').ffill().reset_index() 

选项3
resample

df.set_index('Date').resample('D').first().ffill().reset_index() 

对于pandas=0.16.1

df.set_index('Date').resample('D').ffill().reset_index() 

所有产生相同的结果移到该试样数据集合

enter image description here

+0

THX。我尝试了选项3,并得到一个错误。我想知道在我工作的环境(Quantopian)中方法是否被识别。你是否需要导入任何特定的操作? – jhomme

+0

我正在运行熊猫版本0.16.1 – jhomme

+0

什么是错误? – piRSquared