我有一个编码时间的大型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秒
答案 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)