Как преобразовать данные в столбце, содержащем строку типа «4:20», в число с плавающей точкой - PullRequest
0 голосов
/ 02 января 2019

В моем фрейме данных есть столбец, содержащий такие значения:

 PowerPlayTimeOnIce
       0:05
       0:05
       1:24
       3:29
       1:34
        0
       0:05
        0
        0

Как мне преобразовать их в числа с плавающей запятой?

Этот метод не работал:

df["powerPlayTimeOnIce"] = df["powerPlayTimeOnIce"].astype('float')

РЕДАКТИРОВАТЬ: обновленный пример данных, чтобы лучше соответствовать проблеме

Ответы [ 4 ]

0 голосов
/ 03 января 2019

Вы можете использовать pd.to_timedelta + аксессор .total_seconds(). Сначала вам нужно правильно отформатировать строки (ЧЧ: мм: сс), так как вы не можете указать формат. Хотя, возможно, не относится к хоккейным временам, это может иметь дело с большим временем без особых проблем.

import pandas as pd

s = df.PowerPlayTimeOnIce.replace(':', '', regex=True).str.zfill(6)
pd.to_timedelta(s.str[0:-4]+':'+s.str[-4:-2]+':'+s.str[-2::]).dt.total_seconds()

Выход:

0          5.0
1          5.0
2         84.0
3        209.0
4         94.0
5          5.0
6          0.0
7     446161.0
8    4046161.0
Name: PowerPlayTimeOnIce, dtype: float64

Входные данные

  PowerPlayTimeOnIce
0               0:05
1               0:05
2               1:24
3               3:29
4               1:34
5               0:05
6                  0
7          123:56:01
8         1123:56:01
0 голосов
/ 02 января 2019

Использование to_datetime

s=pd.to_datetime(df.PowerPlayTimeOnIce,format='%M:%S')
s.dt.minute*60+s.dt.second
Out[881]: 
0      5
1      5
2     84
3    209
4     94
5      5
Name: PowerPlayTimeOnIce, dtype: int64

Обновление

s=pd.to_datetime(df.PowerPlayTimeOnIce,format='%M:%S',errors='coerce')

(s.dt.minute*60+s.dt.second).fillna(0)
Out[886]: 
0      5.0
1      5.0
2     84.0
3    209.0
4     94.0
5      5.0
6      0.0
Name: PowerPlayTimeOnIce, dtype: float64

Ввод данных

  PowerPlayTimeOnIce
0               0:05
1               0:05
2               1:24
3               3:29
4               1:34
5               0:05
6                  0
0 голосов
/ 03 января 2019

Если вы хотите очень многословный поток и у вас нет огромного набора данных. Вы могли бы сделать:

df[['min', 'sec']] = df['powerPlayTimeOnIce'].str.split(':', expand=True)

df[['min'] = df[['min'].astype('int')
df['sec'] = df['sec'].apply(lambda x: float('0.'+x), axis=1)

df['diff_in_seconds'] = df['min']/60 + df['sec']

Итак, я разделил ваши данные на минуты и секунды. и оттуда вы можете обратиться к любому формату.

0 голосов
/ 02 января 2019

Вы можете сделать что-то вроде этого:

import pandas as pd

data = ['0:05',
        '0:05',
        '1:24',
        '3:29',
        '1:34',
        '0:05']


def convert(s):
    minutes, seconds = map(int, s.split(":"))
    return 60 * minutes + seconds


df = pd.DataFrame(data=data, columns=['powerPlayTimeOnIce'])
print(df['powerPlayTimeOnIce'].apply(convert))

Вывод

0      5
1      5
2     84
3    209
4     94
5      5
Name: powerPlayTimeOnIce, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...