от струны до тидельты в пандах - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть фрейм данных, где временная метка имеет формат HHHHH: MM

timestamp = pd.Series(['34:23','125:26','15234:52'], index=index)

Я хотел бы преобразовать ее в timedelta.

На данный момент мне удается сделать это наодна строка

str[:-3]
str[-2:]
timedelta(hours=int(str[:-3]),minutes=int(str[-2:]))

Я хотел бы применить ее ко всей серии, если это возможно, более чистым способом.Он существует?

Спасибо,

Ответы [ 4 ]

0 голосов
/ 29 ноября 2018

Вы можете использовать pandas.Series.apply, то есть:

def convert(args):
    return timedelta(hours=int(args[:-3]),minutes=int(args[-2:]))
s = pd.Series(['34:23','125:26','15234:52'])
s = s.apply(convert)
0 голосов
/ 29 ноября 2018

Вы можете использовать методы Pandas по столбцам:

s = pd.Series(['34:23','125:26','15234:52'])

v = s.str.split(':', expand=True).astype(int)
s = pd.to_timedelta(v[0], unit='h') + pd.to_timedelta(v[1], unit='s')

print(s)

0     1 days 10:00:23
1     5 days 05:00:26
2   634 days 18:00:52
dtype: timedelta64[ns]
0 голосов
/ 29 ноября 2018

Разберите дельту в секундах в качестве аргумента для pd.to_timedelta, например,

In [1]: import pandas as pd
In [2]: ts = pd.Series(['34:23','125:26','15234:52'])
In [3]: secs = 60 * ts.apply(lambda x: 60*int(x[:-3]) + int(x[-2:]))
In [4]: pd.to_timedelta(secs, 's')
Out[4]:
0     1 days 10:23:00
1     5 days 05:26:00
2   634 days 18:52:00
dtype: timedelta64[ns]

Редактировать: пропущен ответ erncyp, который также сработает, но вам нужно умножить аргумент до pd.to_timedelta на 60поскольку, если я правильно помню, минуты не доступны в качестве меры истекшего времени, кроме как по модулю предыдущего часа.

0 голосов
/ 29 ноября 2018

Вот как бы я это сделал:

timestamp = pd.Series(['34:23','125:26','15234:52'])
x = timestamp.str.split(":").apply(lambda x: int(x[0])*60 + int(x[1]))
timestamp = pd.to_timedelta(x, unit='s')
...