You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 15:54:04