定义一个函数(pandas)

时间:2015-06-17 14:17:17

标签: python pandas

这已经有效,但我想优化一下:

df['Total Time'] = df['Total Time'].str.split(':').apply(lambda x: (int(x[0])*60.0) + int(x[1]) + (int(x[2]) / 60.0))

我在Excel中使用时间戳(字符串)表示小时:分钟:秒并将其转换为表示分钟的浮点数。与字符串相比,这对我来说更容易玩。

我必须为15列做到这一点。我读过lambda是一个一次性的'功能。是否更好地定义一个函数(拆分然后将值转换为分钟)并将其应用于每列?我是否会遍历列(不是所有列,而是大约30列中的15个)?

在一个单独的文件中,我有另一种技术执行完全相同的任务(将时间戳转换为几分钟):

df2['Total Time']= pd.to_timedelta(df2['Total Time'])
df2['Total Time'] = df2['Total Time'] / pd.offsets.Minute(1)

一种方法本身比另一种方法更好还是更快?

编辑: 我在尝试timedelta方法时遇到错误。看起来有些时间戳字符串的值不正确,但未正确解释。

我希望有人会提供一个功能,我可以用它来有效地将所有内容应用/映射到多个列。我对def和return函数不太熟悉(在学习基本的python之前我学习了基本的pandas,仅仅是出于实际目的......虽然慢慢学习)。需要将这些时间戳转换为分钟

ValueError:无法为[09:38:010]

创建timedelta字符串转换器

1 个答案:

答案 0 :(得分:1)

目前,身体(但更普遍的解决方案)实际上更慢,请参阅问题here

In [28]: pd.set_option('max_rows',12)

In [29]: s = Series(pd.timedelta_range('0',freq='s',periods=10000).format())

In [30]: s
Out[30]: 
0       00:00:00
1       00:00:01
2       00:00:02
3       00:00:03
4       00:00:04
5       00:00:05
          ...   
9994    02:46:34
9995    02:46:35
9996    02:46:36
9997    02:46:37
9998    02:46:38
9999    02:46:39
dtype: object

适用于特定的常规格式

In [31]: %timeit s.str.split(':').apply(lambda x: (int(x[0])*60.0) + int(x[1]) + (int(x[2]) / 60.0))
10 loops, best of 3: 25.2 ms per loop

这将解析几乎所有内容(您可以设置coerce=True强制将无效值强制为NaT), 但正在进行正则表达式匹配,所以有点慢。

In [32]: %timeit pd.to_timedelta(s) / pd.offsets.Minute()
10 loops, best of 3: 82.8 ms per loop

所以寻找志愿者在c / cython中编写timedelta解析器来大大提高这个性能。