Определение последовательных периодов дат для каждой группы

#python #pandas

#python #панды

Вопрос:

Хотел бы знать, как я могу определить последовательные периоды дат с помощью сброса счетчика периодов для каждой группы.

Это моя попытка сделать это по всему фрейму данных, но я не могу понять, как это сделать для каждой группы.

 import pandas as pd

data = {
    "peoples": ["jimbob","jimbob","jimbob", "jimbob","jimbob","jimbob", "sonnyjim","sonnyjim","sonnyjim","sonnyjim"],
    "dates": ["2020-11-01","2020-11-02","2020-11-03","2020-11-06","2020-11-09","2020-11-10", "2020-11-12","2020-11-13","2020-11-20","2020-11-22"]
}

df = pd.DataFrame(data)
df["dates"] = pd.to_datetime(df["dates"])

df["period"] = df["dates"].diff().dt.days.ne(1).cumsum()

print(df)
 

Я хотел бы иметь возможность сделать что-то вроде этого:

     peoples      dates  period
0    jimbob 2020-11-01       1
1    jimbob 2020-11-02       1
2    jimbob 2020-11-03       1
3    jimbob 2020-11-06       2
4    jimbob 2020-11-09       3
5    jimbob 2020-11-10       3
6  sonnyjim 2020-11-12       1
7  sonnyjim 2020-11-13       1
8  sonnyjim 2020-11-20       2
9  sonnyjim 2020-11-22       3
 

Ответ №1:

Вы можете groupby включить peoples фрейм данных, а затем применить пользовательскую lambda функцию dates для вычисления последовательных блоков дат:

 f = lambda s: s.diff().dt.days.ne(1).cumsum()
df['period'] = df.groupby('peoples')['dates'].apply(f)
 

     peoples      dates  period
0    jimbob 2020-11-01       1
1    jimbob 2020-11-02       1
2    jimbob 2020-11-03       1
3    jimbob 2020-11-06       2
4    jimbob 2020-11-09       3
5    jimbob 2020-11-10       3
6  sonnyjim 2020-11-12       1
7  sonnyjim 2020-11-13       1
8  sonnyjim 2020-11-20       2
9  sonnyjim 2020-11-22       3