给定这个数据集:
...我想创建开放的高低列,重新采样到每行的开始分钟。请注意,我们不能简单地.resample()
在这种情况下使用。我希望得到的是一个如下所示的数据集:
我不想为此使用 for 循环,而是对开放、高和低列进行列计算(除非有更快的方法来执行此操作,或者.resample()
在这种情况下可以以某种方式工作)。
时间列是pd.to_datetime()
格式。
我试图为 max 列做这样的事情:
tick_df['tick_high'] = tick_df[(tick_df['time'] >= tick_df['time'].replace(second=0)) & (tick_df['time'] <= tick_df['time'])].max()
...这里的逻辑是,选择分钟顶部的当前日期时间时间(因此为 0 秒)和转到当前行的日期时间之间的行。因此,如果查看第一行,示例将介于2022-02-11 19:57:00
to之间。2022-02-11 19:57:20
但是,当我尝试这个时,我得到了错误:
TypeError: replace() got an unexpected keyword argument 'second'
...因为从技术上讲,我使用的是 pandas 的替换功能,而不是 datetime.replace 功能。所以我也尝试在.dt
之前添加.replace
并得到这个:
AttributeError: 'DatetimeProperties' object has no attribute 'replace'
关于如何实现所需输出的任何建议?作为参考,这是我的可重现代码:
from datetime import datetime
import pandas as pd
# create a mock tick df
tick_time = ["2022-02-11 19:57:20",
"2022-02-11 19:57:40",
"2022-02-11 19:58:01",
"2022-02-11 19:58:09",
"2022-02-11 19:58:31",
"2022-02-11 19:58:45",
"2022-02-11 19:58:58",
"2022-02-11 19:59:00",
"2022-02-11 19:59:20",
"2022-02-11 19:59:40",
"2022-02-11 19:59:55"]
tick_time = pd.to_datetime(tick_time)
tick_df = pd.DataFrame(
{
"time": tick_time,
"tick_close": [440.39,440.38,440.39,440.40,440.41,440.42,440.45,440.50,440.52,440.51,440.59],
},
)
print(tick_df)
# Attempt to resample ticks ohlc from the beginning of each minute
tick_df['tick_high'] = tick_df[(tick_df['time'] >= tick_df['time'].dt.replace(second=0)) & (tick_df['time'] <= tick_df['time'])].max()
我明天会回来查看答案。谢谢!