0

我在 Python3 上编写了以下代码,用于重新采样时间序列数据。我的要求是仅在每天上午 9:00 到下午 4:00 之间重新采样数据。但是,我不能通过使用“按日期分组”对完整数据进行分组并随后合并结果来单独进行重新采样操作,因为我也想在这里使用 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 到下午 4:00 的数据,但是在重新采样时,它还会添加从下午 4:01 到第二天上午 8:59 的数据,因此它需要更多内存。

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

4

1 回答 1

1

以下修改将防止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)
于 2020-07-29T12:21:17.063 回答