Совокупные истекшие минуты из серии «Дата-время Панд» - PullRequest
0 голосов
/ 08 октября 2018

У меня есть столбец меток даты и времени.Мне нужен столбец общих минут, прошедших с первого до последнего значения.

У меня есть:

>>> 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
0 2001-01-01 06:00:00
1 2001-01-01 06:01:00
2 2001-01-01 06:15:00

Мне нужно добавить столбец, который дает промежуточный итог:

timestamp       minutes
1-1-2001 6:00   0
1-1-2001 6:01   1
1-1-2001 6:15   15
1-1-2001 7:00   60
1-1-2001 7:35   95

С трудом манипулируя серией дата-время, чтобы я мог суммировать метку времени.

Я просмотрел много постов и не могу найти ничего, что делает то, что я пытаюсьсделать.Буду признателен за любые идеи!

1 Ответ

0 голосов
/ 08 октября 2018

Вы можете соединить несколько методов вместе:

>>> 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...