Вычитание времени внутри колонны в пандах - PullRequest
0 голосов
/ 31 августа 2018

Я пытался вычесть даты и время между столбцами, которые я прочитал в python, используя pandas dataframe. Я написал код следующим образом:

Time = df['t'] - df['t'].shift(1) + df['t']

Это приводит к сообщению об ошибке. Мой ввод и предполагаемый вывод указаны ниже

Input data:
t =
9:47:00
9:48:00
9:49:00
9:50:00
9:51:00
9:52:00
9:53:00
9:54:00

Я надеюсь, что код выдаст выходные данные (совокупный час, который начинается с нуля.

0
0.016666667
0.033333333
0.05
0.066666667
0.083333333
0.1

Я также пытался превратить его в строку, используя datetime.strptime('t',"%H:%M:%S.%f"), и все равно получаю ошибку.

Любые предложения будут оценены.

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Я думаю , это ответ.

Или, может быть, другим способом -

# lets have some data to process:
stamps = pd.date_range('2018-05-19 18:15:05', periods=4, freq='2H')
df = pd.DataFrame(stamps)

df.apply(lambda e : e + datetime.timedelta(seconds=1))

Показывает:

                0
0 2018-05-19 18:15:06
1 2018-05-19 20:15:06
2 2018-05-19 22:15:06
3 2018-05-20 00:15:06

А это:

df.apply(lambda e : e + datetime.timedelta(seconds=100))
                    0
0 2018-05-19 18:16:45
1 2018-05-19 20:16:45
2 2018-05-19 22:16:45
3 2018-05-20 00:16:45

Просто чтобы увидеть разницу. Совет здесь придерживаться даты. Таким образом timedelta работает. Вы можете использовать combine, чтобы сделать Datetime из Date и Time.

0 голосов
/ 31 августа 2018

Похоже на решение Криса. Вы должны работать с timedelta s с самого начала для более простого решения.

v = pd.to_timedelta(df['t'])
((v - v.shift())).dt.total_seconds().cumsum().div(3600).fillna(0)

0    0.000000
1    0.016667
2    0.033333
3    0.050000
4    0.066667
5    0.083333
6    0.100000
7    0.116667
Name: t, dtype: float64
0 голосов
/ 31 августа 2018

import pandas as pd

# assuming you're working with strings:
t = [
    '9:47:00', '9:48:00', '9:49:00', '9:50:00',
    '9:51:00', '9:52:00', '9:53:00', '9:54:00'
]

df = pd.DataFrame({'time' : pd.to_datetime(t, infer_datetime_format=True)})
print(df)
#>                  time
#> 0 2018-08-30 09:47:00
#> 1 2018-08-30 09:48:00
#> 2 2018-08-30 09:49:00
#> 3 2018-08-30 09:50:00
#> 4 2018-08-30 09:51:00
#> 5 2018-08-30 09:52:00
#> 6 2018-08-30 09:53:00
#> 7 2018-08-30 09:54:00

df['time_shift'] = df.shift(-1)
df['tdelt'] = df['time_shift'] - df['time']
x = df.tdelt.astype('timedelta64[s]') / 3600
x = x[1:-1].cumsum()
print(x)
#> 1    0.016667
#> 2    0.033333
#> 3    0.050000
#> 4    0.066667
#> 5    0.083333
#> 6    0.100000
#> Name: tdelt, dtype: float64

Создано в 2018-08-30 пакетом prexpy

import reprexpy
print(reprexpy.SessionInfo())
#> Session info --------------------------------------------------------------------
#> Platform: Windows-7-6.1.7601-SP1 (64-bit)
#> Python: 3.6
#> Date: 2018-08-30
#> Packages ------------------------------------------------------------------------
#> pandas==0.23.4
#> reprexpy==0.1.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...