无法从 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