Как извлечь часы и минуты из ряда строк в pandas - PullRequest
0 голосов
/ 03 августа 2020

Я часами зацикливался на этой, казалось бы, простой проблеме. Я хотел бы преобразовать следующие строки в минуты. (Или часы и минуты, если бы я мог).

foo['stringtime'] = pd.Series(['1 hour and 59 minutes','2 hours', np.nan, '38 minutes', '4 hours and 31 minutes'])

#What I've tried:
foo['stringtime'] = foo['stringtime'].str.replace(r'hours?','').str.replace(' minutes','').str.split(' and ')

Однако это создаст ситуацию, когда '2 hours' и '38 minutes' станут ['2'] и ['38']

#What I would like to happen:
foo.head()
output:
119
120
NaN (or 0)
38
271

Есть ли какой-нибудь красивый элегантный способ c pythoni для этого?

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Другой способ - просто использовать numexpr для вычисления числового уравнения:

import numexpr

foo = pd.Series(['1 hour and 59 minutes','2 hours', np.nan, '38 minutes', '4 hours and 31 minutes'])

(foo.str.replace(r' hours?','*60').str.replace(' minutes','').str.replace(' and ', '+')
    .fillna('0').apply(numexpr.evaluate))

Вывод:

0    119
1    120
2      0
3     38
4    271
1 голос
/ 03 августа 2020

Попробуйте использовать Regex.

Пример:

import re

def p_time(val):
    try:
        t = 0
        h = re.search(r"(\d+) hour(s)?", val)
        if h:
            t += int(h.group(1)) * 60
        m = re.search(r"(\d+) minute(s)?", val)
        if m:
            t += int(m.group(1))
        return t
    except:
        pass
    return 0

s = pd.Series(['1 hour and 59 minutes','2 hours', np.nan, '38 minutes', '4 hours and 31 minute'])
print(s.apply(p_time).astype(int))

Вывод:

0    119
1    120
2      0
3     38
4    271
dtype: int32
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...