pandas100个骚操作:使用 Datetime 提速 50 倍运行速度!
平时我们运行pandas
少不了和时间打交道,而大多情况下许多朋友都是暴力解决问题,直接让pandas
自己转换和处理。
对于平时的学习和小测试是没什么问题的,但当跑一些大数据的时候往往会非常的慢,而这个时间性能其实是完全可以优化的。
本次东哥介绍一个非常简单的操作,使用Datetime
变换时间类型,让你的代码运行速度飞速提升。
>>> df = pd.read_csv('demand_profile.csv')
>>> df.head()
date_time energy_kwh
0 1/1/13 0:00 0.586
1 1/1/13 1:00 0.580
2 1/1/13 2:00 0.572
3 1/1/13 3:00 0.596
4 1/1/13 4:00 0.592
pandas
和numpy
都有一个 dtypes
的概念。如果没有特殊声明,那么date_time
将会使用一个 object
的 dtype
类型,如下面代码所示:date_time object
energy_kwh float64
dtype: object
>>> type(df.iat[0, 0])
str
object
类型像一个大的容器,不仅仅可以承载 str
,也可以包含那些不能很好地融进一个数据类型的任何特征列。而如果我们将日期作为 str
类型就会极大的影响效率。date_time
列格式化为datetime
对象数组(pandas
称之为时间戳)。pandas
在这里操作非常简单,操作如下:>>> df['date_time'].dtype
datetime64[ns]
df
看看转化后的效果是什么样的。date_time energy_kwh
0 2013-01-01 00:00:00 0.586
1 2013-01-01 01:00:00 0.580
2 2013-01-01 02:00:00 0.572
3 2013-01-01 03:00:00 0.596
4 2013-01-01 04:00:00 0.592
date_time
的格式已经自动转化了,但这还没完,在这个基础上,我们还是可以继续提高运行速度的。如何提速呢?为了更好的对比,我们首先通过 timeit
装饰器来测试一下上面代码的转化时间。... def convert(df, column_name):
... return pd.to_datetime(df[column_name])
>>> df['date_time'] = convert(df, 'date_time')
Best of 3 trials with 10 function calls per trial:
Function `convert` ran in average of 1.610 seconds.
>>> def convert_with_format(df, column_name):
... return pd.to_datetime(df[column_name],
... format='%d/%m/%y %H:%M')
Best of 3 trials with 100 function calls per trial:
Function `convert_with_format` ran in average of 0.032 seconds.
format
。由于在CSV
中的datetimes
并不是 ISO 8601
格式的,如果不进行设置的话,那么pandas
将使用 dateutil
包把每个字符串str
转化成date
日期。datetime
已经是 ISO 8601
格式了,那么pandas
就可以立即使用最快速的方法来解析日期。这也就是为什么提前设置好格式format
可以提升这么多。 赞 (0)