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

Pandas按ID分组统计日期频次及总天数问题求助

解决方案:按ID分组统计总天数与日期频次

首先,我们需要先处理日期格式,提取出Date_Time中的日期部分(去掉时分秒),这样才能准确统计日期的出现频次,而不是完整时间戳的频次。接下来分三步完成需求:


1. 数据预处理:提取日期列

先把Date_Time转换为datetime类型,然后提取纯日期部分:

import pandas as pd

# 示例数据
data = pd.DataFrame({ 
    'ID': [1, 1, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6], 
    'Date_Time': ['2010-01-01 12:01:00', '2010-01-01 01:27:33', '2010-04-02 12:01:00', '2010-04-01 07:24:00', 
                  '2011-01-01 12:01:00', '2011-01-01 01:27:33', '2013-01-01 12:01:00', '2014-01-01 12:01:00', 
                  '2014-01-01 01:27:33', '2015-01-01 01:27:33', '2016-01-01 01:27:33', '2011-01-01 01:28:00']
})

# 提取纯日期列
data['Date'] = pd.to_datetime(data['Date_Time']).dt.date

2. 统计两个核心指标

  • 每个ID的总天数:这里指该ID下出现的不同日期的数量,用nunique()统计去重后的日期数:

    # 统计ID对应的总天数
    id_total_days = data.groupby('ID')['Date'].nunique().reset_index(name='Total_Days')
    
  • 每个ID下各日期的出现频次:按ID和Date分组统计数量,再用unstack()把日期转为列,缺失值填充为0:

    # 统计各日期的出现频次
    id_date_counts = data.groupby(['ID', 'Date']).size().unstack(fill_value=0)
    

3. 合并结果

把两个统计结果按ID合并,得到最终的DataFrame:

# 合并总天数与日期频次
final_result = id_total_days.merge(id_date_counts, on='ID', how='left')

运行后final_result的样式如下(示例):

IDTotal_Days2010-01-012010-04-012010-04-022011-01-012013-01-012014-01-012015-01-012016-01-01
1321100000
2100020000
3100001000
4100000200
5100000010
6200010001

为什么你的原代码无法合并?

你之前的代码number = data.groupby(by=['ID, Date_Time']).size().unstack(fill_value=0)有两个问题:

  1. 分组列语法错误:['ID, Date_Time']是一个包含单个字符串的列表,应该写成['ID', 'Date_Time']才是按两列分组;
  2. 统计维度不对:你按完整的时间戳(Date_Time)分组,每个时间戳几乎都是唯一的,导致unstack()后会生成大量列,且和原数据的结构不匹配,自然无法合并。我们提取日期部分后,统计维度是日期而非时间戳,结果结构更规整,也能顺利和总天数统计结果合并。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:47:37