我有一个超过数亿行的df
latitude longitude time VAL
0 -39.20000076293945312500 140.80000305175781250000 1972-01-19 13:00:00 1.20000004768371582031
1 -39.20000076293945312500 140.80000305175781250000 1972-01-20 13:00:00 0.89999997615814208984
2 -39.20000076293945312500 140.80000305175781250000 1972-01-21 13:00:00 1.50000000000000000000
3 -39.20000076293945312500 140.80000305175781250000 1972-01-22 13:00:00 1.60000002384185791016
4 -39.20000076293945312500 140.80000305175781250000 1972-01-23 13:00:00 1.20000004768371582031
... ...
它包含一个time
列,其类型为UTC中的datetime64
。下面的代码将创建一个新列isInDST
,以指示time
是否处于本地时区的夏令时
df['isInDST'] = pd.DatetimeIndex(df['time']).tz_localize('UTC').tz_convert('Australia/Victoria').map(lambda x : x.dst().total_seconds()!=0)
处理15223160行大约需要400秒
是否有更好的方法以更好的性能实现这一点?{
所有结果都是在1M数据点上计算的
Cython+
np.vectorize
比原始代码快7.2倍
1.08 s±10.2 ms/圈/圈
np.vectorize
比原始代码快6.5倍
1.2 s±29.3 ms/圈/圈
基于documentation(
The implementation is essentially a for loop
),我期望结果与列表理解的结果相同,但始终比列表理解好一点列表理解
比原始代码快5.9倍
1.33 s±48.4 ms/回路
这个结果表明pandas
map
/apply
非常慢,它增加了额外的开销,只需使用python for循环就可以消除这些开销原始方法(
map
在DatetimeIndex上)7.82 s±84.3 ms/回路
在1M行虚拟数据上进行测试
另外,在100K和10M行上运行代码-结果与行数成线性关系
相关问题 更多 >
编程相关推荐