这已经有效,但我想优化一下:
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字符串转换器答案 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解析器来大大提高这个性能。