从编码时间的numpy数组中获取时间和分钟

时间:2014-04-16 21:40:45

标签: python-2.7 numpy pandas

我有一个编码时间的大型numpy数组。假设我们有类似的东西:

from pandas import DataFrame
t = {'time': ['08:35', '08:38', '13:42', '13:46']}
df = DataFrame(t)

import numpy as np
time_array = np.array(df.time)
print time_array

输出:

['08:35' '08:38' '13:42' '13:46']

是否有一种有效的方法可以从time_array单独获得小时和分钟?

当然这可以在循环中完成:

for i in range(len(time_array)):
    print np.fromstring(time_array[i], dtype=int, sep=":")

输出:

[ 8 35]
[ 8 38]
[13 42]
[13 46]

但我正在寻找一个更快的'矢量化的方式,如果有的话。

修改

我已经计划了解决方案(见下面的代码)。

def foo(array):
    for i in range(len(array)):
        array[i] = np.fromstring(array[i], dtype=int, sep=':')

%timeit foo(time_array)

输出:1个循环,最佳3:每循环3.02秒

Paul H的解决方案1:

def foo2(df):
    df['hour'] = df['time'].apply(lambda x: int(x.split(':')[0]))
    df['minute'] = df['time'].apply(lambda x: int(x.split(':')[1]))

%timeit foo2(df)

输出:1个循环,最好为3:每循环4.31秒

Paul H&#3的解决方案2:

import time
def foo3(df):
    df['hour'] = df['time'].apply(lambda x: time.strptime(x, '%H:%M').tm_hour)
    df['minute'] = df['time'].apply(lambda x: time.strptime(x, '%H:%M').tm_min)

%timeit foo3(df)

输出:1个循环,最佳3:每循环42.1秒

1 个答案:

答案 0 :(得分:2)

我会留在熊猫里再呆一会儿:

from pandas import DataFrame
t = {'time': ['08:35', '08:38', '13:42', '13:46']}
df = DataFrame(t)
df['hour'] = df['time'].apply(lambda x: int(x.split(':')[0]))
df['minute'] = df['time'].apply(lambda x: int(x.split(':')[1]))
print(df)

    time  hour  minute
0  08:35     8      35
1  08:38     8      38
2  13:42    13      42
3  13:46    13      46

然后你可以df['hour'].values来获得一系列小时数。

编辑:

只是为了笑容,你也可以这样做:

import time
df['hour'] = df.timestring.apply(lambda x: time.strptime(x, '%H:%M').tm_hour)
df['minute'] = df.timestring.apply(lambda x: time.strptime(x, '%H:%M').tm_min)