如何在Pandas中拆分日期列并对日段进行分组?
解决Pandas日期拆分与日分组的实现方法
没问题,我来一步步帮你搞定这个日期特征工程的需求,这在回归分析里是很常见的操作~
第一步:将字符串日期转为Datetime类型
首先得把你格式为"1/31/2010"的字符串日期转换成Pandas的datetime类型,这样才能方便提取年、月、日信息。代码如下:
import pandas as pd # 假设你的数据框是df,日期列名为'date_col' df['date_col'] = pd.to_datetime(df['date_col'], format='%m/%d/%Y')
- 这里的
format='%m/%d/%Y'是关键,对应你的日期格式月/日/年,如果格式不匹配会报错; - 如果存在无效日期,可以加上
errors='coerce'参数,把无效值转为NaT(缺失日期),方便后续处理:pd.to_datetime(df['date_col'], format='%m/%d/%Y', errors='coerce')
第二步:拆分年、月、日为独立列
转换为datetime类型后,就可以用.dt属性直接提取年、月、日:
# 提取年 df['year'] = df['date_col'].dt.year # 提取月 df['month'] = df['date_col'].dt.month # 提取日 df['day'] = df['date_col'].dt.day
第三步:将日分为1-10、11-20、21-31三个组别
这里有两种常用方法,你可以选自己习惯的:
方法1:用pd.cut()快速分组
这是最简洁的方式,直接指定区间和对应标签:
# 定义分组区间和标签 bins = [0, 10, 20, 31] labels = ['1-10', '11-20', '21-31'] # 生成分组列 df['day_group'] = pd.cut(df['day'], bins=bins, labels=labels, include_lowest=True)
include_lowest=True是为了让第一个区间包含1(默认是左开右闭,加这个后变成左闭右闭,确保1被分到1-10组);- 如果需要生成数值型的分组标签(比如1、2、3),可以去掉
labels参数,直接用pd.cut()返回的区间编码。
方法2:自定义函数+apply()
如果你需要更灵活的分组逻辑,可以写个自定义函数:
def get_day_group(day): if 1 <= day <=10: return '1-10' elif 11 <= day <=20: return '11-20' elif 21 <= day <=31: return '21-31' else: return None # 处理异常值 df['day_group'] = df['day'].apply(get_day_group)
完整示例代码
为了让你更直观地看到效果,这里给一个完整的测试示例:
import pandas as pd # 构造测试数据 data = {'date_col': ['1/5/2010', '1/15/2010', '1/25/2010', '2/8/2010', '3/22/2010']} df = pd.DataFrame(data) # 转换日期格式 df['date_col'] = pd.to_datetime(df['date_col'], format='%m/%d/%Y') # 拆分年月日 df['year'] = df['date_col'].dt.year df['month'] = df['date_col'].dt.month df['day'] = df['date_col'].dt.day # 日分组 bins = [0,10,20,31] labels = ['1-10', '11-20', '21-31'] df['day_group'] = pd.cut(df['day'], bins=bins, labels=labels, include_lowest=True) print(df)
运行后会输出包含所有新特征的数据框,直接可以用于线性回归分析啦~
内容的提问来源于stack exchange,提问作者Jerry
相关产品推荐
相关产品推荐

