Pandas:将列从分钟(类型对象)转换为数字

时间:2015-05-09 23:14:05

标签: python pandas

我想将Pandas DataFrame的列从object转换为数字(例如float64)。 DataFrame如下:

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'])的各种变体,但没有成功。

1 个答案:

答案 0 :(得分: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来避免整数除法问题。