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

Pandas如何按条件删除DataFrame中不符合日期规则的行

问题场景

使用yfinance拉取指定区间月度ETF收益率数据时,返回的DataFrame时间索引存在非标准月度对齐的异常行(例如索引为2021-03-22的行),需要删除所有日期不以01结尾的行,仅保留符合月度时间规则的记录。
初始实现代码:

import yfinance as yf
import numpy as np
import pandas as pd
import datetime

ETF_DB = ['QQQ', 'EGFIX']
fundsret = yf.download(ETF_DB, start=datetime.date(2020,12,31), end=datetime.date(2022,4,30), interval='1mo')['Adj Close'].pct_change()
df = pd.DataFrame(fundsret)
df

代码运行输出示例:
运行结果示例

实现方法

不要用逐行遍历的方式处理,pandas的向量化筛选性能更好、代码更简洁:

  • 方法1:直接通过时间索引的日属性筛选(推荐,性能最优)
    yfinance返回的时间索引默认是datetime类型,直接提取索引的day属性,保留日份等于1的行即可,自动过滤所有不符合要求的记录:
df = df[df.index.day == 1]
  • 方法2:字符串匹配筛选
    如果需要严格匹配日期字符串以01结尾的规则,可以将时间索引格式化为字符串后做后缀匹配:
df = df[df.index.strftime('%Y-%m-%d').str.endswith('01')]

优化提示:yfinance的月度间隔接口偶尔会出现日期偏移的脏数据,更稳妥的方案是拉取日度数据后自行重采样为月度频率,从根源避免日期不对齐问题:

# 拉取日度收盘价
price_df = yf.download(ETF_DB, start=datetime.date(2020,12,31), end=datetime.date(2022,4,30))['Adj Close']
# 按月初对齐重采样,计算月度收益率
fundsret = price_df.resample('MS').first().pct_change()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:15:37