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

问题

我有一个包含以 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 pd

from datetime import datetime


# Initialise prices dataframe with missing data

prices = 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 intervals

idx_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)


沧海一幻觉
浏览 110回答 3
3回答

繁花不似锦

使用DataFrame.asfreq与Datetimeindex:prices = prices.set_index('datetime').asfreq('1Min')print(prices)                        open     high      low    closedatetime                                               2019-02-07 16:00:00  124.634  124.624  124.650  124.6202019-02-07 16:01:00      NaN      NaN      NaN      NaN2019-02-07 16:02:00      NaN      NaN      NaN      NaN2019-02-07 16:03:00      NaN      NaN      NaN      NaN2019-02-07 16:04:00  124.624  124.627  124.647  124.617

largeQ

更手动的答案是:from datetime import datetime, timedeltafrom dateutil import parserimport pandas as pddf = pd.DataFrame({&nbsp;'a': ['2021-02-07 11:00:30', '2021-02-07 11:00:31', '2021-02-07 11:00:35'],&nbsp;'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:&nbsp; dt_range.append(min_dt.strftime("%Y-%m-%d %H:%M:%S"))&nbsp; min_dt += timedelta(seconds=1)complete_df = pd.DataFrame({'a': dt_range})final_df = complete_df.merge(df, how='left', on='a')它转换以下数据帧:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;a&nbsp; &nbsp; &nbsp;b0&nbsp; 2021-02-07 11:00:30&nbsp; 64.81&nbsp; 2021-02-07 11:00:31&nbsp; 64.82&nbsp; 2021-02-07 11:00:35&nbsp; 50.3到:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;a&nbsp; &nbsp; &nbsp;b0&nbsp; 2021-02-07 11:00:30&nbsp; 64.81&nbsp; 2021-02-07 11:00:31&nbsp; 64.82&nbsp; 2021-02-07 11:00:32&nbsp; &nbsp;NaN3&nbsp; 2021-02-07 11:00:33&nbsp; &nbsp;NaN4&nbsp; 2021-02-07 11:00:34&nbsp; &nbsp;NaN5&nbsp; 2021-02-07 11:00:35&nbsp; 50.3我们可以稍后填充它的空值
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python