【问题标题】:count consecutive days python dataframe计算连续天数python数据框
【发布时间】:2019-03-28 05:02:41
【问题描述】:

我正在尝试按连续日期对 ID 进行分组。

ID     Date   
abc    2017-01-07  
abc    2017-01-08  
abc    2017-01-09  
abc    2017-12-09  
xyz    2017-01-05  
xyz    2017-01-06 
xyz    2017-04-15  
xyz    2017-04-16 

需要退货:

ID     Count
abc    3
abc    1
xyz    2
xyz    2

我试过了:

d = {'ID': ['abc', 'abc', 'abc', 'abc', 'xyz', 'xyz', 'xyz', 'xyz'], 'Date': ['2017-01-07','2017-01-08', '2017-01-09', '2017-12-09', '2017-01-05', '2017-01-06', '2017-04-15', '2017-04-16']}
df = pd.DataFrame(data=d)
df['Date'] =  pd.to_datetime(df['Date'])

today = pd.to_datetime('2018-10-23')   
x = df.sort_values('Date', ascending=0)
g = x.groupby(['ID'])
x[(today - x['Date']).dt.days == g.cumcount()].groupby(['ID']).size()

是否有一种简单的方法可以按 ID 获取所有日期范围的计数?

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    创建一个Series,用于检查每个 ID 中的日期之间的差异。检查这是否不是 1 天,然后按 ID 和该系列的累积总和进行分组。

    import pandas as pd
    
    s = df.groupby('ID').Date.diff().dt.days.ne(1).cumsum()
    df.groupby(['ID', s]).size().reset_index(level=1, drop=True)
    

    输出:

    ID
    abc    3
    abc    1
    xyz    2
    xyz    2
    dtype: int64
    

    【讨论】:

    • 可能会更改为df.groupby('ID').Date.diff().dt.days.ne(1).cumsum()
    • 嗨,一个问题,为什么要删除fillna()?谢谢
    • @CatarinaNogueira 我想这真的不需要。 diff 构成第一组NaN,所以我填充了它,但没有填充分组系列只是从 1 而不是 0 开始计数,这没有区别。
    • @ALollz 如何添加所有 ID?而不是得到 xyz 两次。把它当作一个 xyz=4
    • @Geraldkibz 应该是 df 中日期列的名称
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2020-05-18
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多