2012-10-21 69 views
1

日期系列看起來像這樣。Python Pandas:矢量化的操作錯誤?

In [89]: 
db.close[:5] 

Out[89]: 
datetime 
2012-06-28 23:58:00 1.243925 
2012-06-28 23:59:00 1.244125 
2012-06-29 00:00:00 1.244065 
2012-06-29 00:01:00 1.243875 
2012-06-29 00:02:00 1.243865 
Name: close 

我想從每個元素中減去前一個元素。

In [93]: 
db.close[1:5] - db.close[:4] 

Out[93]: 
datetime 
2012-06-28 23:58:00 NaN 
2012-06-28 23:59:00  0 
2012-06-29 00:00:00  0 
2012-06-29 00:01:00  0 
2012-06-29 00:02:00 NaN 
Name: close 

將數組減去無偏移量。

但是,當我比較陣列元件...

N [94]:

db.close[1:5] == db.close[:4] 
Out[94]: 
datetime 
2012-06-28 23:59:00 False 
2012-06-29 00:00:00 False 
2012-06-29 00:01:00 False 
2012-06-29 00:02:00 False 
Name: close 

回答

3

這實際上是故意的。算術運算可以進行數據對齊,但比較不會。我曾考慮過改變它,但發現它造成了太多問題(特別是將Series傳遞給期望NumPy數組的函數時(例如numpy.diff)。

編輯:得到調整,你可以自己動手完成對齊:

In [10]: numpy.equal(*a.align(b)) 
Out[10]: 
2000-01-03 False 
2000-01-04  True 
2000-01-05  True 
2000-01-06  True 
2000-01-07  True 
2000-01-10 False 
Freq: B 
+0

感謝您的解釋。 我想避免迭代。因此,有可能通過載體做出我需要的東西? – user1763885

+0

查看編輯...... –

0

我找到了答案,以我自己的問題。這可能對某人有用。

In [38]: 
db.close.shift(periods=1).head() - db.close.head() 

Out[38]: 
datetime 
2012-06-28 23:58:00  NaN 
2012-06-28 23:59:00 -0.00020 
2012-06-29 00:00:00 0.00006 
2012-06-29 00:01:00 0.00019 
2012-06-29 00:02:00 0.00001 
Freq: T, Name: close 

不幸的是,它比正常的算術運算慢2-3倍。

In [40]: 

%timeit db.close.shift(periods=1) - db.close 
1000 loops, best of 3: 1.64 ms per loop 

%timeit db.close - db.open 
1000 loops, best of 3: 700 us per loop