Панды подсчитывают, сколько раз между последовательными строками будет разница в X сек. - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь посчитать, сколько раз за id, date значение datetime отличается от предыдущего ряда на 10 секунд.

Данные

id      timestamp      datetime          date           
1       1496660340  2019-06-05 10:59:00  2019-06-05
1       1496660340  2019-06-05 10:59:10  2019-06-05 
1       1496660355  2019-06-05 10:59:40  2019-06-05 <- 30 sec diff from above, so not counted

1       1496655555  2019-06-06 11:58:00  2019-06-06     
1       1496666666  2019-06-06 11:58:10  2019-06-06     
1       1496666677  2019-06-06 11:58:20  2019-06-06 

2       1496655555  2019-06-05 11:58:00  2019-06-05     
2       1496666666  2019-06-05 11:58:10  2019-06-05     
2       1496666677  2019-06-05 11:58:20  2019-06-05     

Data columns (total 4 columns):
       id              int64
     timestamp         int64
     datetime          datetime64[ns]
      date              object

Желаемая

id         date      num_count
1       2019-06-05      1
1       2019-06-06      2
2       2019-06-05      2

что я пробовал

# get all the time differences first
df['timediff'] = df.groupby(['id','date'])['datetime'].diff() / np.timedelta64(1, 's')

#Count the number of 10sec differences
x = pd.DataFrame(df[df['timediff']==10].groupby(['id','date'],as_index=False)['timediff'].count())

Я не уверен, что это правильный путь. Может ли кто-нибудь указать мне правильное направление?

1 Ответ

0 голосов
/ 24 января 2019

Вы можете использовать пользовательскую функцию с groupby:

def difference_condition(x):
    return x.diff().dt.total_seconds().eq(10).sum()

res = df.groupby(['id', 'date'])['datetime'].apply(difference_condition)

print(res.reset_index(name='count'))

   id       date  count
0   1 2019-06-05      1
1   1 2019-06-06      2
2   2 2019-06-05      2

Настройка

from io import StringIO

x = """id|timestamp|datetime|date
1       |1496660340  |2019-06-05 10:59:00  |2019-06-05
1       |1496660340  |2019-06-05 10:59:10  |2019-06-05 
1       |1496660355  |2019-06-05 10:59:40  |2019-06-05
1       |1496655555  |2019-06-06 11:58:00  |2019-06-06     
1       |1496666666  |2019-06-06 11:58:10  |2019-06-06     
1       |1496666677  |2019-06-06 11:58:20  |2019-06-06 
2       |1496655555  |2019-06-05 11:58:00  |2019-06-05     
2       |1496666666  |2019-06-05 11:58:10  |2019-06-05     
2       |1496666677  |2019-06-05 11:58:20  |2019-06-05"""

df = pd.read_csv(StringIO(x), sep='|')
df[['datetime', 'date']] = df[['datetime', 'date']].apply(pd.to_datetime)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...