You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一DataFrame的日期区间创建条件Pandas DataFrame

我来帮你搞定这个需求!这种根据指定时间区间给不同标的标记特定值的场景,用Pandas的索引切片就能轻松解决,咱们一步步来实现:

第一步:明确需求与模拟数据

先模拟两个示例DataFrame,方便你对应自己的实际数据调整:

import pandas as pd
import numpy as np

# 模拟df1:带DateTime索引的多ticker时间序列
dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
tickers = ['AAPL', 'MSFT', 'GOOG']
df1 = pd.DataFrame(index=dates, columns=tickers)

# 模拟df2:每个ticker的起止日期区间
df2 = pd.DataFrame({
    'Ticker': ['AAPL', 'MSFT', 'GOOG'],
    'Start_Date': pd.to_datetime(['2023-03-01', '2023-06-01', '2023-09-01']),
    'End_Date': pd.to_datetime(['2023-05-31', '2023-08-31', '2023-11-30'])
})

第二步:创建并填充df3

首先初始化df3为和df1结构完全一致的DataFrame,全部填充np.nan,然后遍历df2的每个区间,给对应ticker的指定日期范围赋值1.0:

# 初始化df3,结构和df1一致,默认全为NaN
df3 = df1.copy()
df3[:] = np.nan

# 遍历df2的每个ticker区间
for _, row in df2.iterrows():
    ticker = row['Ticker']
    # 先判断ticker是否在df3中存在,避免报错
    if ticker not in df3.columns:
        print(f"警告:ticker {ticker} 在df1中不存在,已跳过")
        continue
    start_date = row['Start_Date']
    end_date = row['End_Date']
    # 用Pandas的日期切片定位区间,赋值1.0
    df3.loc[start_date:end_date, ticker] = 1.0

第三步:验证结果

你可以通过以下方式检查是否符合预期:

# 查看AAPL标记为1.0的前5行
print(df3[df3['AAPL'] == 1.0].head())

# 查看MSFT区间外的行,确认是NaN
print(df3.loc['2023-02-28', 'MSFT'])

补充说明

  • 务必确保df1的索引是DateTime类型,df2的Start_Date和End_Date也是datetime格式,否则日期切片会失效;
  • 如果你的ticker数量非常多(比如上千个),循环可能效率稍低,可以考虑用merge结合between的方式优化,但对于大多数场景,循环的可读性和效率已经足够;
  • 如果df2中同一个ticker有多个区间,这段代码也能自动叠加标记(多个区间都会被设为1.0)。

内容的提问来源于stack exchange,提问作者dsugasa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:13:16