每日 pandas 数据帧到分钟频率的转换不适用于 2 行数据帧
Conversion of Daily pandas dataframe to minute frequency does not work for 2 row dataframe
我正在尝试将每日频率数据帧转换为分钟数据,在之前的 post 中建议使用下面的 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()
但是当我使用较小的数据框时,它 returns 由于某种原因是一个空数据框:
df2=df.iloc[0:2,:]
df2_min = df2.unstack().asfreq('Min', method='ffill').between_time('8:30','16:00').stack()
有人对这种奇怪的行为有解释吗?
edt:我注意到代码只有在数据框至少有 7 行时才有效。
如果您只有 2 行输入 DataFrame,那么在通过 unstack
重塑后得到一行 DataFrame
和 pandas 无法创建连续分钟 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)
我正在尝试将每日频率数据帧转换为分钟数据,在之前的 post 中建议使用下面的 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()
但是当我使用较小的数据框时,它 returns 由于某种原因是一个空数据框:
df2=df.iloc[0:2,:]
df2_min = df2.unstack().asfreq('Min', method='ffill').between_time('8:30','16:00').stack()
有人对这种奇怪的行为有解释吗?
edt:我注意到代码只有在数据框至少有 7 行时才有效。
如果您只有 2 行输入 DataFrame,那么在通过 unstack
重塑后得到一行 DataFrame
和 pandas 无法创建连续分钟 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)