2015-05-09 2 views
1

Я хочу преобразовать столбец Data Data с рамкой данных из object в число (например, float64). DataFrame заключается в следующем:Pandas: конвертировать столбец из минут (тип объекта) на номер

import pandas as pd 
import numpy as np 
import datetime as dt 

df = pd.read_csv('data.csv') 
df 
    ID  MIN 
0 201167 32:59:00 
1 203124  14:23 
2 101179  8:37 
3 200780  5:22 
4 202699  NaN 
5 203117  NaN 
6 202331 36:05:00 
7 2561 30:43:00 

Я хотел бы преобразовать MIN столбец из типа object к числу (например, float64). Например, 32:59:00 должен стать 32.983333.

Я не уверен, если это необходимо в качестве первого шага, но я могу преобразовать каждую NaN в 0 через:

df['MIN'] = np.where(pd.isnull(df['MIN']), '0', df['MIN']) 

Как эффективно преобразовать весь столбец? Я пробовал варианты dt.datetime.strptime(), df['MIN'].astype('datetime64') и pd.to_datetime(df['MIN']) без успеха.

ответ

0

Определение функции преобразователя:

def str_to_number(time_str): 
    if not isinstance(time_str, str): 
     return 0 
    minutes, sec, *_ = [int(x) for x in time_str.split(':')] 
    return minutes + sec/60 

и применить его к колонке MIN:

df.MIN = df.MIN.map(str_to_number) 

работы.

До:

ID MIN 
0 1 32:59:00 
1 2 NaN 
2 3 14:23 

После:

ID MIN 
0 1 32.983333 
1 2 0.000000 
2 3 14.383333 

выше для Python 3. Это работает для Python 2:

def str_to_number(time_str): 
    if not isinstance(time_str, str): 
     return 0 
    entries = [int(x) for x in time_str.split(':')] 
    minutes = entries[0] 
    sec = entries[1] 
    return minutes + sec/60.0 

Обратите внимание на 60.0. В качестве альтернативы используйте from __future__ import print_function, чтобы избежать проблемы с делением целочисленного деления.

+0

Я работаю в iPython Notebook (через Python 2.7.6 на Mac OS X) и '* _' в функции конвертера приводит к синтаксической ошибке:' SyntaxError: недопустимый синтаксис'. Как я могу обойти это? – Adam

+0

@Adam добавила версию для Python 2. –

Смежные вопросы