熊猫每天都会在特定时间范围内重新采样

时间:2020-07-29 11:34:13

标签: python-3.x pandas time-series pandas-resample

我在Python3上编写了以下代码,用于重新采样时间序列数据。我的要求是每天仅在9:00 AM至4:00 PM之间对数据进行重新采样。但是,我无法通过使用“按日期分组”对完整数据进行分组来单独进行重新采样操作,然后再合并结果,因为我也想在此处使用ffill()。

import pandas as pd
import datetime as dt
import numpy as np

# Generating Sample Data - Start
dateTime = pd.date_range(dt.datetime(2020,7,20,7,0,0), dt.datetime(2020,7,29,17,0,0), freq='1T')
open = np.random.randint(1, 100, len(dateTime))
high = np.random.randint(1, 100, len(dateTime))
low = np.random.randint(1, 100, len(dateTime))
close = np.random.randint(1, 100, len(dateTime))
volume = np.random.randint(1, 100, len(dateTime))
df = pd.DataFrame({'dateTime': dateTime, 'open': open, 'high': high, 'low': low, 'close': close, 'volume': volume})
df = df[df.dateTime.dt.time > dt.time(9,0,0)]
df = df[df.dateTime.dt.time < dt.time(16,0,0)]
# Generating Sample Data - End

# Resample Data - Start
df = df.resample("2T", on='dateTime', base=15).agg({'open':'first', 'high':'max', 'low':'min', 'close':'last', 'volume':'last'}).ffill()
# Resample Data - End

print(df.to_string())

上面提到的代码可以正常工作,但是当数据更多时,有时会出现诸如“无法分配具有形状的数组……”之类的错误。实际上,原始数据帧仅包含从9:00 AM到4:00 PM的数据,但是在重新采样时,它还会从4:01 PM到第二天的8:59 AM添加数据,因此需要更多的内存。

那么,有没有更简单/更快速的方法来提高内存效率呢?

1 个答案:

答案 0 :(得分:0)

进行以下修改将阻止resample()在交易日之间的整个晚上插入值。行数从6690减少至2100

import pandas as pd
import datetime as dt
import numpy as np

# Generating Sample Data - Start
dateTime = pd.date_range(dt.datetime(2020,7,20,7,0,0), dt.datetime(2020,7,29,17,0,0), freq='1T')
open = np.random.randint(1, 100, len(dateTime))
high = np.random.randint(1, 100, len(dateTime))
low = np.random.randint(1, 100, len(dateTime))
close = np.random.randint(1, 100, len(dateTime))
volume = np.random.randint(1, 100, len(dateTime))
df = pd.DataFrame({'dateTime': dateTime, 'open': open, 'high': high, 'low': low, 'close': close, 'volume': volume})
df = df[df.dateTime.dt.time > dt.time(9,0,0)]
df = df[df.dateTime.dt.time < dt.time(16,0,0)]
# Generating Sample Data - End
# Resample Data - Start
newdf = pd.DataFrame()
for day in df.dateTime.dt.floor("D").unique():
    mask = df[df.dateTime.dt.floor("D")==day].index
    newdf = pd.concat([newdf, df.loc[mask].resample("2T", on="dateTime", base=15).agg({'open':'first', 'high':'max', 'low':'min', 'close':'last', 'volume':'last'}).ffill().reset_index()])
# Resample Data - End
newdf.reset_index(drop=True)