如何在Pandas中为DataFrame添加每日指定时间开盘价列
问题描述
我有一个存储半小时级数据的Pandas DataFrame,数据结构如下:
DateTime Open High Low Close Volume 0 2005-09-06 17:00:00 1103.00 1103.50 1103.00 1103.25 744
我想为该数据添加名为“Daily_Open”的列,该列的值为对应日期14:30的开盘价,并填充到当日的所有行中。假设每天有10条半小时数据行。在TSQL中我会使用关联子查询或基于日期部分的连接来实现。
我尝试了以下代码:
data = pd.read_csv("ESHalf.txt", ) data.rename(columns={"Close/Last": "Close"}, inplace=True) data.columns = ["DateTime", "Open", "High", "Low", "Close", "Volume"] data["DateTime"] = pd.to_datetime(data["DateTime"]) data["Date"] = data["DateTime"].dt.date open_cond = (data["DateTime"].dt.hour == 9) & (data["DateTime"].dt.minute == 30) data["Daily_Low"] = data["Open"][open_cond]
这段代码能成功提取目标时间的开盘价,但将其应用到原DataFrame时,非14:30时间的行都出现了NaN。我觉得可以使用apply或transform方法来解决,请问有什么可行方案?
解决方案
方法1:groupby + transform(符合你提到的transform思路)
先筛选出每日14:30的开盘价,再按日期分组后用transform把对应值填充到当日所有行:
# 修正条件:需求是14:30,原代码写的是9:30,注意这里调整 open_cond = (data["DateTime"].dt.hour == 14) & (data["DateTime"].dt.minute == 30) # 提取日期与对应14:30开盘价的映射 daily_open_map = data.loc[open_cond, ["Date", "Open"]].set_index("Date")["Open"] # 分组后用transform填充 data["Daily_Open"] = data.groupby("Date")["Date"].transform(lambda x: daily_open_map.loc[x.iloc[0]])
方法2:map方法(简洁高效)
构建日期到目标开盘价的字典,直接用map匹配填充:
open_cond = (data["DateTime"].dt.hour == 14) & (data["DateTime"].dt.minute == 30) # 生成日期到14:30开盘价的字典 daily_open_dict = data.loc[open_cond].set_index("Date")["Open"].to_dict() # 映射到原DataFrame data["Daily_Open"] = data["Date"].map(daily_open_dict)
这种方法性能较好,适合处理大规模数据。
方法3:merge(对应TSQL的连接逻辑)
把每日14:30的数据单独提取为一个小DataFrame,再按日期和原表做左连接,和你熟悉的TSQL关联思路一致:
open_cond = (data["DateTime"].dt.hour == 14) & (data["DateTime"].dt.minute == 30) # 提取每日14:30的开盘价并重命名列 daily_open_df = data.loc[open_cond, ["Date", "Open"]].rename(columns={"Open": "Daily_Open"}) # 左连接原表 data = data.merge(daily_open_df, on="Date", how="left")
注意:原代码中条件写的是9:30,但需求是14:30,记得修正小时数,避免结果不符合预期。
内容的提问来源于stack exchange,提问作者Tommo
相关产品推荐
相关产品推荐

