如何在Pandas的Datetime DataFrame中添加diff_col列标记日期类别
问题:为Datetime类型DataFrame添加日期差异标记列
示例输入DataFrame
timestamp value ... metric 36 2014-04-02 17:20:00 125.098263 ... 25.098263 14 2014-04-06 16:25:00 140.072787 ... 265.171050 10 2014-04-11 09:00:00 127.882020 ... 393.053070 45 2014-04-11 09:05:00 115.705719 ... 508.758789 24 2014-04-11 09:15:00 127.261178 ... 636.019967 17 2014-04-11 09:20:00 121.157997 ... 757.177965 49 2014-04-11 09:25:00 120.468468 ... 877.646433 8 2014-04-11 09:45:00 135.642696 ... 1013.289128 33 2014-04-11 09:55:00 125.210049 ... 1138.499178 19 2014-04-11 10:05:00 159.259713 ... 1297.758890 52 2014-04-11 10:20:00 150.082482 ... 1447.841373
需求说明
新增diff_col列,规则如下:
- 若该行日期(仅日期部分)与多数记录的日期不同,标记为
diff - 否则标记为
same
示例中2014-04-02和2014-04-06的记录标记为diff,2014-04-11的所有记录标记为same。
用户尝试代码df['diff_col']=df.groupby(pd.Grouper(key = 'timestamp', freq='1D'))未得到预期结果。
解决方案
完整代码
import pandas as pd # 确保timestamp列为datetime类型 df['timestamp'] = pd.to_datetime(df['timestamp']) # 1. 按日期分组统计各日期的记录数 date_counts = df.groupby(df['timestamp'].dt.date).size() # 2. 获取出现次数最多的日期(多数记录所属日期) most_common_date = date_counts.idxmax() # 3. 生成diff_col标记列 df['diff_col'] = df['timestamp'].dt.date.apply(lambda x: 'same' if x == most_common_date else 'diff')
代码解释
- 类型校验:先将
timestamp转为datetime类型,避免后续日期提取操作出错。 - 统计日期频率:按纯日期(
dt.date)分组,统计每个日期对应的记录数量。 - 确定多数日期:用
idxmax()直接获取记录数最多的日期,也就是多数记录所属的日期。 - 生成标记列:对每行的日期部分做判断,匹配多数日期则标记
same,否则标记diff。
预期输出
timestamp value ... metric diff_col 36 2014-04-02 17:20:00 125.098263 ... 25.098263 diff 14 2014-04-06 16:25:00 140.072787 ... 265.171050 diff 10 2014-04-11 09:00:00 127.882020 ... 393.053070 same 45 2014-04-11 09:05:00 115.705719 ... 508.758789 same 24 2014-04-11 09:15:00 127.261178 ... 636.019967 same 17 2014-04-11 09:20:00 121.157997 ... 757.177965 same 49 2014-04-11 09:25:00 120.468468 ... 877.646433 same 8 2014-04-11 09:45:00 135.642696 ... 1013.289128 same 33 2014-04-11 09:55:00 125.210049 ... 1138.499178 same 19 2014-04-11 10:05:00 159.259713 ... 1297.758890 same 52 2014-04-11 10:20:00 150.082482 ... 1447.841373 same
内容的提问来源于stack exchange,提问作者user680288
相关产品推荐
相关产品推荐

