无法从 1 分钟到 5 分钟的数据重新采样 pandas 时间序列

Posted

技术标签:

【中文标题】无法从 1 分钟到 5 分钟的数据重新采样 pandas 时间序列【英文标题】:Trouble resampling pandas timeseries from 1min to 5min data 【发布时间】:2022-01-09 18:51:13 【问题描述】:

我有一个 1 分钟间隔的盘中股票数据,如下所示:

import yfinance as yf
import pandas as pd
n = yf.download('^nsei', period= '5d', interval= '1m')

我正在尝试将其重新采样为“5m”数据,如下所示:

n = n.resample('5T').agg(dict(zip(n.columns, ['first', 'max', 'min', 'last', 'last', 'sum'])))

但它会尝试重新采样不在我的数据中的日期时间信息。市场数据仅在下午 03:30 之前可用,但是当我查看重新采样的数据帧时,我发现它试图在整个 24 小时内重新采样。 如何在下午 3:30 之前停止重新采样并继续进行下一个日期? 由于这个原因,现在数据框主要具有 NaN 值。欢迎提出任何建议。

【问题讨论】:

【参考方案1】:

agg() 是为每一列应用单独的操作方法,我使用它是为了看到股票技术分析中所谓的“烛台”形态。 通过删除 NaN 值,我能够解决此问题。

【讨论】:

【参考方案2】:

我不确定你想用 agg() 函数实现什么。假设'first' 指第一个分位数,'last' 指最后一个分位数,并且您想计算每列的一些统计信息,我建议您执行以下操作:

获取您的数据:

import yfinance as yf
import pandas as pd
n = yf.download('^nsei', period= '5d', interval= '1m')

重新采样您的数据:

注意:您的结果与使用 n.resample('5T').first() 重新采样时的结果相同,但这意味着数据框中的每个值 等于 5 分钟间隔中的第一个值,包括 5 价值观。更合乎逻辑的重采样方法是使用mean()sum()函数如下图。

如果这是股票价格数据,使用mean() 更有意义:

resampled_df = n.resample('5T').mean()

要删除超出工作库存时间的重新采样时间,您有 2 个选项。

选项 1: 删除 na 值:

filtered_df = resampled_df.dropna()

注意:如果您使用 sum(),这将不起作用,因为结果不会包含缺失值而是零。

选项 2 基于开始和结束时间的过滤器

获取数据作为datetime.time 对象可用的一天中的最小和最大时间:

start = n.index.min().time() # 09:15 as datetime.time object
end = n.index.max().time() # 15:29 as datetime.time object

根据开始和结束时间过滤数据框:

filtered_df = resampled_df.between_time(start, end)

获取统计数据:

statistics = filtered_df.describe()
statistics

请注意,describe() 不会包含总和,因此要添加它,您可以这样做:

statistics = pd.concat([statistics, filtered_df.agg(['sum'])])
statistics

输出:

【讨论】:

以上是关于无法从 1 分钟到 5 分钟的数据重新采样 pandas 时间序列的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 将 5 分钟数据重新采样为每小时平均值:日期问题 [重复]

Pandas 将时间序列数据重新采样为 15 分钟和 45 分钟 - 使用多索引或列

Python pandas 将 15 分钟 ohlc 重新采样为 75 分钟 ohlc

猪:如何重新采样时间序列数据?

如何在 Pandas/Numpy 中使用 dateOffset 对日内时间序列数据进行重新采样?

pandas OHLC 聚合随着 OHLC 的时间重新采样