从DataFrame筛选InvoiceDate在指定日期范围±7天内的行
解决方案
首先确认所有日期列均为datetime64类型,这是日期运算的基础。若读取CSV时未指定类型,先执行转换:
import pandas as pd # 转换日期列格式 df["InvoiceDate"] = pd.to_datetime(df["InvoiceDate"]) df["CalcStartDate"] = pd.to_datetime(df["CalcStartDate"]) df["CalcEndDate"] = pd.to_datetime(df["CalcEndDate"])
接下来用pd.Timedelta做日期偏移——Pandas的向量化操作对大数据量效率极高,远优于逐行循环,完全不用顾虑性能问题:
# 筛选InvoiceDate在[CalcStartDate-7天, CalcEndDate+7天]范围内的行 filtered_df = df[ (df["InvoiceDate"] >= df["CalcStartDate"] - pd.Timedelta(days=7)) & (df["InvoiceDate"] <= df["CalcEndDate"] + pd.Timedelta(days=7)) ]
额外优化建议
- 读取CSV时直接指定日期列,避免后续二次转换:
df = pd.read_csv( "your_file.csv", parse_dates=["InvoiceDate", "CalcStartDate", "CalcEndDate"] ) - 若数据量过大导致内存不足,可使用
chunksize分块读取处理,再合并结果:chunk_list = [] for chunk in pd.read_csv("your_file.csv", parse_dates=["InvoiceDate", "CalcStartDate", "CalcEndDate"], chunksize=10000): filtered_chunk = chunk[ (chunk["InvoiceDate"] >= chunk["CalcStartDate"] - pd.Timedelta(days=7)) & (chunk["InvoiceDate"] <= chunk["CalcEndDate"] + pd.Timedelta(days=7)) ] chunk_list.append(filtered_chunk) filtered_df = pd.concat(chunk_list)
内容的提问来源于stack exchange,提问作者5122014009
相关产品推荐
相关产品推荐

