基于Date列动态划分DataFrame训练集与测试集的方法问询
基于Date列划分训练集与测试集的解决方案
步骤说明
不用硬编码日期,借助relativedelta可自动处理跨年份的月份计算(比如1月减3个月自动得到前一年的10月),完整流程如下:
- 确保Date列为datetime类型
如果Date列是字符串格式,先转换为datetime类型避免计算出错:
import pandas as pd from datetime import datetime from dateutil.relativedelta import relativedelta # 转换Date列为datetime类型(未转换时执行) whatever_df['Date'] = pd.to_datetime(whatever_df['Date'])
- 获取数据中的最近日期
从Date列提取最大日期作为时间基准:
latest_date = whatever_df['Date'].max()
- 计算划分分界日期
用relativedelta减去3个月,自动处理跨年、跨月的边界情况:
# 基础分界:最近日期往前推3个月的当天 cutoff_date = latest_date - relativedelta(months=3) # 若需按自然月整月划分(如示例中以3月1日为分界),调整到当月第一天 cutoff_date = (latest_date - relativedelta(months=3)).replace(day=1)
- 划分训练集与测试集
根据分界日期筛选数据:
# 训练集:早于分界日期的所有行 train_df = whatever_df[whatever_df['Date'] < cutoff_date] # 测试集:分界日期及之后的所有行(对应示例中2022年3月至6月) test_df = whatever_df[whatever_df['Date'] >= cutoff_date]
关键说明
relativedelta会自动处理月份计算的边界问题,无需手动判断1月、2月的特殊情况,例如:datetime(2023, 1, 31) - relativedelta(months=3)→datetime(2022, 10, 31)datetime(2023, 2, 28) - relativedelta(months=3)→datetime(2022, 11, 28)
- 如果需要训练集包含截至2022年3月、测试集包含3-6月,通过
(latest_date - relativedelta(months=3)).replace(day=1)即可自动算出分界日期,无需硬编码。
内容的提问来源于stack exchange,提问作者Hefe
相关产品推荐
相关产品推荐

