为了账号安全,请及时绑定邮箱和手机立即绑定

查找以 1 分钟间隔采样的 Pandas 时间序列数据帧中的空白,并用新行填充空白

查找以 1 分钟间隔采样的 Pandas 时间序列数据帧中的空白,并用新行填充空白

沧海一幻觉 2021-11-02 17:15:53
问题我有一个包含以 1 分钟间隔采样的财务数据的数据框。有时可能会丢失一两行数据。我正在寻找一种好的(简单而有效的)方法将新行插入到数据框中缺少数据的点。除了包含时间戳的索引外,新行可以为空。例如: #Example Input---------------------------------------------                      open     high     low      close 2019-02-07 16:01:00  124.624  124.627  124.647  124.617   2019-02-07 16:04:00  124.646  124.655  124.664  124.645   # Desired Ouput--------------------------------------------                      open     high     low      close 2019-02-07 16:01:00  124.624  124.627  124.647  124.617   2019-02-07 16:02:00  NaN      NaN      NaN      NaN 2019-02-07 16:03:00  NaN      NaN      NaN      NaN 2019-02-07 16:04:00  124.646  124.655  124.664  124.645 我目前的方法基于这篇文章 - 使用 Pandas 在时间序列数据中查找缺失的分钟数据- 仅建议如何识别差距。不是如何填充它们。我正在做的是创建一个 1 分钟间隔的 DateTimeIndex。然后使用这个索引,我创建了一个全新的数据帧,然后可以将其合并到我的原始数据帧中,从而填补空白。代码如下所示。这样做的方式似乎很复杂。我想知道是否有更好的方法。也许重新采样数据?import pandas as pdfrom datetime import datetime# Initialise prices dataframe with missing dataprices = pd.DataFrame([[datetime(2019,2,7,16,0),  124.634,  124.624, 124.65,   124.62],[datetime(2019,2,7,16,4), 124.624,  124.627,  124.647,  124.617]])prices.columns = ['datetime','open','high','low','close']prices = prices.set_index('datetime')print(prices)# Create a new dataframe with complete set of time intervalsidx_ref = pd.DatetimeIndex(start=datetime(2019,2,7,16,0), end=datetime(2019,2,7,16,4),freq='min')df = pd.DataFrame(index=idx_ref)# Merge the two dataframes prices = pd.merge(df, prices, how='outer', left_index=True, right_index=True)print(prices)
查看完整描述

3 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

使用DataFrame.asfreq与Datetimeindex:


prices = prices.set_index('datetime').asfreq('1Min')

print(prices)

                        open     high      low    close

datetime                                               

2019-02-07 16:00:00  124.634  124.624  124.650  124.620

2019-02-07 16:01:00      NaN      NaN      NaN      NaN

2019-02-07 16:02:00      NaN      NaN      NaN      NaN

2019-02-07 16:03:00      NaN      NaN      NaN      NaN

2019-02-07 16:04:00  124.624  124.627  124.647  124.617


查看完整回答
反对 回复 2021-11-02
?
largeQ

TA贡献2039条经验 获得超7个赞

更手动的答案是:


from datetime import datetime, timedelta

from dateutil import parser


import pandas as pd




df = pd.DataFrame({

 'a': ['2021-02-07 11:00:30', '2021-02-07 11:00:31', '2021-02-07 11:00:35'],

 'b': [64.8, 64.8, 50.3]

})


max_dt = parser.parse(max(df['a']))

min_dt = parser.parse(min(df['a']))



dt_range = []

while min_dt <= max_dt:

  dt_range.append(min_dt.strftime("%Y-%m-%d %H:%M:%S"))

  min_dt += timedelta(seconds=1)



complete_df = pd.DataFrame({'a': dt_range})

final_df = complete_df.merge(df, how='left', on='a')

它转换以下数据帧:


                     a     b

0  2021-02-07 11:00:30  64.8

1  2021-02-07 11:00:31  64.8

2  2021-02-07 11:00:35  50.3

到:


                     a     b

0  2021-02-07 11:00:30  64.8

1  2021-02-07 11:00:31  64.8

2  2021-02-07 11:00:32   NaN

3  2021-02-07 11:00:33   NaN

4  2021-02-07 11:00:34   NaN

5  2021-02-07 11:00:35  50.3

我们可以稍后填充它的空值


查看完整回答
反对 回复 2021-11-02
  • 3 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信