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

使用Pandas按列分组后日期格式丢失问题求助

解决pandas分组后日期变为数字的问题

问题原因

你看到的数字(如43248)是Excel风格的日期序列号(代表从1900-01-01开始的天数),核心问题有两点:

  1. 分组聚合(agg)后生成了多级列名,你后续的日期转换代码没有正确匹配目标列,导致转换逻辑错误;
  2. pandas对datetime类型执行聚合操作时,若内部处理不当,会将datetime对象转为对应的序列号数值。

正确解决方案

方案1:修复多级列的日期转换逻辑

分组后的grouped_df是多级列结构,需要通过多级索引定位列,转换时使用unit='D'参数(匹配按天计算的序列号):

unique_df['created_date'] = pd.to_datetime(unique_df['created_date'], format='%Y-%m-%d')
unique_df['date'] = pd.to_datetime(unique_df['date'], format='%Y-%m-%d')

aggregations = {
    'username': 'first',
    'created_date': 'first',
    'id': 'count',
    'date': ['first', 'last'],
    'like_count': 'sum',
    'list_count': ['first', 'last']   
}

grouped_df = unique_df.groupby('id').agg(aggregations)

# 正确处理多级列的日期转换
grouped_df[('created_date', 'first')] = pd.to_datetime(grouped_df[('created_date', 'first')], unit='D')
grouped_df[('date', 'first')] = pd.to_datetime(grouped_df[('date', 'first')], unit='D')
grouped_df[('date', 'last')] = pd.to_datetime(grouped_df[('date', 'last')], unit='D')

# 可选:将多级列名转为单级,方便后续操作
grouped_df.columns = ['_'.join(col) for col in grouped_df.columns]

方案2:聚合时直接重命名列,避免多级索引

更简洁的方式是在聚合时指定新列名,直接生成单级列,后续处理更直观:

unique_df['created_date'] = pd.to_datetime(unique_df['created_date'], format='%Y-%m-%d')
unique_df['date'] = pd.to_datetime(unique_df['date'], format='%Y-%m-%d')

# 用嵌套字典指定聚合规则和新列名
aggregations = {
    'username': ('username', 'first'),
    'created_date': ('created_date', 'first'),
    'id': ('id_count', 'count'),
    'date': [('date_first', 'first'), ('date_last', 'last')],
    'like_count': ('like_total', 'sum'),
    'list_count': [('list_count_first', 'first'), ('list_count_last', 'last')]   
}

grouped_df = unique_df.groupby('id').agg(**aggregations)

# 若仍有日期变为序列号,直接用unit='D'转换
grouped_df['created_date'] = pd.to_datetime(grouped_df['created_date'], unit='D')
grouped_df['date_first'] = pd.to_datetime(grouped_df['date_first'], unit='D')
grouped_df['date_last'] = pd.to_datetime(grouped_df['date_last'], unit='D')

方案3:确保聚合时保留datetime类型(推荐)

如果unique_df中created_date和date已经是datetime类型,正常情况下agg('first')应该保留datetime类型,出现数字可能是显示设置或版本问题。先检查聚合前的列类型:

print(unique_df.dtypes)

确认类型后,可强制设置显示格式避免序列号:

grouped_df.style.format({
    ('created_date', 'first'): lambda x: x.strftime('%Y-%m-%d'),
    ('date', 'first'): lambda x: x.strftime('%Y-%m-%d'),
    ('date', 'last'): lambda x: x.strftime('%Y-%m-%d')
})

内容的提问来源于stack exchange,提问作者aetosti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:57:28