Вы можете соединить несколько методов вместе:
>>> df['minutes'] = df['timestamp'].diff().fillna(0).dt.total_seconds()\
... .cumsum().div(60).astype(int)
>>> df
timestamp minutes
0 2001-01-01 06:00:00 0
1 2001-01-01 06:01:00 1
2 2001-01-01 06:15:00 15
Создание:
>>> df = pd.DataFrame({'timestamp': [
... pd.Timestamp('2001-01-01 06:00:00'),
... pd.Timestamp('2001-01-01 06:01:00'),
... pd.Timestamp('2001-01-01 06:15:00')
... ]})
Пошаговое руководство
Самый простой способ разбить это -отделяйте каждый промежуточный вызов метода.
df['timestamp'].diff()
дает вам серию панд, эквивалентную Python datetime.timedelta
, разницу во времени от каждого значения к следующему.
>>> df['timestamp'].diff()
0 NaT
1 00:01:00
2 00:14:00
Name: timestamp, dtype: timedelta64[ns]
Этосодержит значение N / A (NaT
/ не время), потому что нечего вычитать из первого значения.Вы можете просто заполнить его нулевым значением для timedeltas:
>>> df['timestamp'].diff().fillna(0)
0 00:00:00
1 00:01:00
2 00:14:00
Name: timestamp, dtype: timedelta64[ns]
Теперь вам нужно получить фактическое целое число (минуты) от этих объектов.В .dt.total_seconds()
, .dt
- это «средство доступа», позволяющее получить доступ к группе методов, позволяющих работать с данными, подобными дате и времени:
>>> df['timestamp'].diff().fillna(0).dt.total_seconds()
0 0.0
1 60.0
2 840.0
Name: timestamp, dtype: float64
Результатом является инкрементное второе изменениекак поплавок.Это необходимо на совокупной основе, в минутах и в виде целого числа.Вот что делают последние 3 операции:
>>> df['timestamp'].diff().fillna(0).dt.total_seconds().cumsum().div(60).astype(int)
0 0
1 1
2 15
Name: timestamp, dtype: int64
Обратите внимание, что astype(int)
выполнит округление, если у вас есть секунды, которые не делятся на 60.