【发布时间】:2019-07-07 21:56:17
【问题描述】:
我正在尝试将每日频率数据帧转换为分钟数据,即对于每一行,我希望按分钟重复代码和日期的组合,并且在之前的帖子 (Conversion of Daily pandas dataframe to minute frequency) 中建议对我来说使用下面的 ffil 方法,但这种方法错误地将某些行情的个别行填充到第二天。如下图所示:
所以下面的数据框应该被转换并且它可以工作,因为日期是连续的:
import pandas as pd
dict1 = [
{'ticker':'jpm','date': '2016-11-27','returns': 0.2},
{'ticker':'ge','date': '2016-11-28','returns': 0.2},
{'ticker':'amzn','date': '2016-11-29','returns': 0.2}
]
df1= pd.DataFrame(dict1)
df1['date'] = pd.to_datetime(df1['date'])
df1=df1.set_index(['date','ticker'], drop=True)
df_min1 = df1.unstack().asfreq('Min', method='ffill').between_time('13:30','13:32').stack()
在 df2 以下跳过 1 天,然后在结果数据帧 df_min2 中,第一个代码在最初跳过的日期中重复:
dict2 = [
{'ticker':'jpm','date': '2016-11-27','returns': 0.2},
{'ticker':'ge','date': '2016-11-29','returns': 0.2},
{'ticker':'amzn','date': '2016-11-30','returns': 0.2}
]
df2 = pd.DataFrame(dict2)
df2['date'] = pd.to_datetime(df2['date'])
df2=df2.set_index(['date','ticker'], drop=True)
df_min2 = df2.unstack().asfreq('Min', method='ffill').between_time('13:30','13:32').stack()
谁能提出解决方案?
【问题讨论】:
-
hmmm,如果连续的 datetimeindex,时间序列的 pandas 效果最好。所以最后需要删除带有
2016-11-28的行,因为date中不存在? -
是的,我的 datetimeindex 不是连续的。所以每一天,我都有不同的代码清单,第二天,我有不同的代码。有时,会跳过一天。
-
我知道一个事实,任何股票一年最多只出现 4 次。因此,如果连续 2 天出现一个代码,则只有第一个是正确的。所以也许可以循环遍历索引以查看是否有任何连续的代码,如果有,只保留第一个。
-
我想出了一个解决方案,我只是在最开始的日期创建新列,并在最后创建另一个列与每日日期,如果两者不匹配,我删除该行。我将发布解决方案以供将来参考。
-
非常感谢您在这方面的帮助以及 jezrael 之前的其他问题,谢谢!!!!