使用Pandas按列分组后日期格式丢失问题求助
解决pandas分组后日期变为数字的问题
问题原因
你看到的数字(如43248)是Excel风格的日期序列号(代表从1900-01-01开始的天数),核心问题有两点:
- 分组聚合(
agg)后生成了多级列名,你后续的日期转换代码没有正确匹配目标列,导致转换逻辑错误; - 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
相关产品推荐
相关产品推荐

