每天的熊猫数据范围转换为微小频率不适合2行数据框架



我正在尝试将每日频率数据帧转换为微小的数据,并且在上一篇文章中,建议使用以下ffil方法,但似乎与包含包含的数据框架不起作用只有2行(每天的熊猫数据框架转换为微小频率(。

因此,应该转换以下数据框架。

import pandas as pd
dict = [
        {'ticker':'jpm','date': '2016-11-28','returns': 0.2},
{ 'ticker':'ge','date': '2016-11-28','returns': 0.2},
{'ticker':'fb', 'date': '2016-11-28','returns': 0.2},
{'ticker':'aapl', 'date': '2016-11-28','returns': 0.2},
{'ticker':'msft','date': '2016-11-28','returns': 0.2},
{'ticker':'amzn','date': '2016-11-28','returns': 0.2},
{'ticker':'jpm','date': '2016-11-29','returns': 0.2},
{'ticker':'ge', 'date': '2016-11-29','returns': 0.2},
{'ticker':'fb','date': '2016-11-29','returns': 0.2},
{'ticker':'aapl','date': '2016-11-29','returns': 0.2},
{'ticker':'msft','date': '2016-11-29','returns': 0.2},
{'ticker':'amzn','date': '2016-11-29','returns': 0.2}
]
df = pd.DataFrame(dict)
df['date']      = pd.to_datetime(df['date'])
df=df.set_index(['date','ticker'], drop=True)  

这在整个数据帧上工作:

df_min = df.unstack().asfreq('Min', method='ffill').between_time('8:30','16:00').stack()

但是,当我使用较小的数据框时,由于某种原因,它会返回一个空框架:

df2=df.iloc[0:2,:]
df2_min = df2.unstack().asfreq('Min', method='ffill').between_time('8:30','16:00').stack()

有人对这种奇怪的行为有解释吗?

edt:我注意到仅在数据框中至少有7行时才有效。

如果只有2行输入数据框架,则在unstack重新设计后获取一行DataFrame,而PANDAS无法创建连续的MININE DataFrame,因为只有一个值DatetimeIndex

可能的解决方案是在重塑后的第二天添加,将其填写最后一行数据,应用解决方案,并在最后一步中通过iloc的位置删除最后的助手行:

df2=df.iloc[0:2]
print (df2)
                   returns
date       ticker         
2016-11-28 jpm         0.2
           ge          0.2
df3 = df2.unstack()
print (df3)
ticker         jpm   ge
date                   
2016-11-28     0.2  0.2
df3.loc[df3.index.max() + pd.Timedelta(1, unit='d')] = df3.iloc[-1]
print (df3)
           returns     
ticker         jpm   ge
date                   
2016-11-28     0.2  0.2
2016-11-29     0.2  0.2 <- helper row
df_min = df3.asfreq('Min', method='ffill')
print (df_min.tail())
                    returns     
ticker                  jpm   ge
date                            
2016-11-28 23:56:00     0.2  0.2
2016-11-28 23:57:00     0.2  0.2
2016-11-28 23:58:00     0.2  0.2
2016-11-28 23:59:00     0.2  0.2
2016-11-29 00:00:00     0.2  0.2 <- helper row
df_min = df_min.iloc[:-1].between_time('8:30','16:00').stack()
#print (df_min)

最新更新