按日期范围分组与熊猫

elj*_*o67 2 python datetime group-by pandas pandas-groupby

我希望按两列分组:user_id和date; 但是,如果日期足够接近,我希望能够将两个条目视为同一组和组的相应部分.日期是mdy

user_id     date       val
1           1-1-17     1
2           1-1-17     1
3           1-1-17     1
1           1-1-17     1
1           1-2-17     1
2           1-2-17     1
2           1-10-17    1
3           2-1-17     1
Run Code Online (Sandbox Code Playgroud)

分组将按user_id分组,日期为+/- 3天.所以通过求和val的组看起来像:

user_id     date       sum(val)
1           1-2-17     3
2           1-2-17     2
2           1-10-17    1
3           1-1-17     1
3           2-1-17     1
Run Code Online (Sandbox Code Playgroud)

有人可以想到这可以(有点)轻松完成吗?我知道这有一些问题.例如,如果日期与三天之间无休止地串起来怎么办.但我使用的确切数据每人只有2个值..

谢谢!

cs9*_*s95 8

我将其转换为datetime列,然后使用pd.TimeGrouper:

dates =  pd.to_datetime(df.date, format='%m-%d-%y')
print(dates)
0   2017-01-01
1   2017-01-01
2   2017-01-01
3   2017-01-01
4   2017-01-02
5   2017-01-02
6   2017-01-10
7   2017-02-01
Name: date, dtype: datetime64[ns]

df = (df.assign(date=dates).set_index('date')
        .groupby(['user_id', pd.TimeGrouper('3D')])
        .sum()
        .reset_index())    
print(df)
   user_id       date  val
0        1 2017-01-01    3
1        2 2017-01-01    2
2        2 2017-01-10    1
3        3 2017-01-01    1
4        3 2017-01-31    1
Run Code Online (Sandbox Code Playgroud)

类似的解决方案pd.Grouper:

df = (df.assign(date=dates)
        .groupby(['user_id', pd.Grouper(key='date', freq='3D')])
        .sum()
        .reset_index())
print(df)
   user_id       date  val
0        1 2017-01-01    3
1        2 2017-01-01    2
2        2 2017-01-10    1
3        3 2017-01-01    1
4        3 2017-01-31    1
Run Code Online (Sandbox Code Playgroud)

更新:TimeGrouper将在大熊猫的未来版本中弃用,因此Grouper在这种情况下会更受欢迎(感谢您的抬头,Vaishali!).

  • 我总是害怕触及任何与时间相关的问题...哈哈顺便说一句+1 (2认同)