例如,将1分钟数据重新索引到每日数据(例如16:00的每日价格索引),如果某一天的16:00时间戳没有1分钟数据的情况,我们希望从最后一个非空1min数据转发填充.在下面的例子中,13日16:00之前没有1min数据,最后1min数据来自10日.
当使用带有method ='ffill'的reindex时,不会期望下面的代码在16:00在16:00填写值吗?检查daily1表明它缺失了.
import pandas as pd
import numpy as np
hf_index = pd.date_range(start='2013-05-09 9:00', end='2013-05-13 23:59', freq='1min')
hf_prices = np.random.rand(len(hf_index))
hf = pd.DataFrame(hf_prices, index=hf_index)
hf.ix['2013-05-10 18:00':'2013-05-13 18:00',:]=np.nan
hf.plot()
ind_daily = pd.date_range(start='2013-05-09 16:00', end='2013-05-13 16:00', freq='B')
print(ind_daily.values)
daily1 = hf.reindex(index=ind_daily, method='ffill')
Run Code Online (Sandbox Code Playgroud)
要填写为一个(或者更确切地说是我)期望,我需要这样做:
daily2 = daily1.fillna(method='ffill')
Run Code Online (Sandbox Code Playgroud)
如果是这种情况,reindex实际上做的填充方法是什么.我只是从熊猫文档中不清楚.在我看来,我不应该做上述这一行.
我也在 github 上写下了我的评论:
我认为目前的行为更有意义。在某些情况下,“nan”值可以是有效的“实际”值。由于索引的变化,实际“nan”值的概念应该与“nan”值不同。如果我有一个像这样的数据框:
A B C
1 1.242 NaN 0.110
3 NaN -0.185 -0.209
5 -0.581 1.483 NaN
Run Code Online (Sandbox Code Playgroud)
我想将所有 nan 保留为 nan,这样更有意义:
df.reindex( [2, 4, 6], method='ffill' )
A B C
2 1.242 NaN 0.110
4 NaN -0.185 -0.209
6 -0.581 1.483 NaN
Run Code Online (Sandbox Code Playgroud)
只需取任何值(nan 或非nan)并向前填充,直到下一个可用索引。重新索引不应对数据强制执行强制填充。
这与
df.reindex( [2, 4, 6], method=None )
Run Code Online (Sandbox Code Playgroud)
产生
A B C
2 NaN NaN NaN
4 NaN NaN NaN
6 NaN NaN NaN
Run Code Online (Sandbox Code Playgroud)
这是一个例子:
np.nan
只能表示不适用;假设我有每小时的数据,而在周末,一些计算是不适用的。我将nan
在周末填写这些专栏。现在,如果我reindex
要更精细的索引,比如说每分钟,重新索引将选择周五的最后一个值,并在整个周末填写它。这是错误的。
在重新索引数据帧时,前向填充意味着只取任何值( nan 或不是 nan )并向前填充直到下一个可用索引。“nan”值可以只是您想要保持原样的实际有效观察值。
重新索引不应对数据强制执行强制填充。