Python Pandas如何按ID聚合日期为日期列表并解决纳秒时间戳输出问题
长整数的编码本质
你看到的长整数是pandas中datetime64类型的底层纳秒级UNIX时间戳:这类数值从标准时间起点1970-01-01 00:00:00 UTC开始累计,单位为纳秒,当聚合流程没有正确保留日期类型、直接把pandas内部的存储值导出为列表时,就会暴露为这种19位长度的整数。
出现这个问题的核心原因是:原始数据中的DATE列被pandas自动识别为datetime类型后,在调用unique().tolist()聚合时,没有对日期值做格式化转换,直接读取了底层的数值存储内容。
可落地的聚合实现方案
方案1:聚合前统一格式化日期(推荐,执行效率最高)
在分组聚合之前,先将DATE列强制转换为YYYY-MM-DD格式的字符串,从根源上避免暴露底层存储值,完整可运行的代码如下:
# 1. 统一将DATE列转为标准YYYY-MM-DD格式的字符串,兼容原始列是字符串或datetime类型的场景 df['DATE'] = pd.to_datetime(df['DATE']).dt.strftime('%Y-%m-%d') # 2. 按ID和日期排序,保证聚合后的列表内日期顺序正确 df.sort_values(by=['ID', 'DATE'], ascending=True, inplace=True) # 3. 分组聚合,直接把同ID的日期收集为列表 df_agg = df.groupby('ID', as_index=False)['DATE'].agg(list)
这段代码运行后,DATE列的输出会完全匹配你期望的格式:每个单元格对应同ID下按时间排序的日期字符串列表。
方案2:逆向转换已生成的长整数结果
如果已经跑完聚合拿到了存纳秒时间戳的结果,不需要重新加载原始数据,直接逐列表做逆向转换即可:
# 对DATE列里的每个时间戳列表,批量转为标准日期字符串 df_pivot['DATE'] = df_pivot['DATE'].apply( lambda timestamp_list: [ pd.to_datetime(ts, unit='ns').strftime('%Y-%m-%d') for ts in timestamp_list ] )
注意:转换时
unit参数必须设置为'ns',和pandas的datetime存储单位保持一致。如果错误填成秒、毫秒级单位,会出现几百年的日期偏差。
原有代码的优化点
你编写的聚合逻辑存在两个可以简化、提升稳定性的细节:
- 不需要自定义lambda聚合逻辑,pandas内置的
agg(list)可以直接将同组的列值收集为列表,执行效率比自定义lambda更高 - 不需要用
to_records()做DataFrame转换,groupby时设置as_index=False参数,就能直接把ID作为普通列保留,和目标输出结构完全匹配
内容的提问来源于stack exchange,提问作者KubiK888
相关产品推荐
相关产品推荐

