使用减法运算符导致两个datetime64空系列出错

时间:2016-07-05 10:08:47

标签: python pandas

我有一个包含两个datetime64列的数据框:

In [119]: df.dtypes
Out[119]: 
beg    datetime64[ns]
end    datetime64[ns]
dtype: object

有时,此数据框可能为空。在这种情况下,end减去beg的减法使用减号运算符失败,但使用sub方法。

In [120]: df.end - df.beg
/Users/guillaumethomas/Documents/project/env3.4/lib/python3.4/site-packages/pandas/core/ops.py:450: PerformanceWarning: Adding/subtracting array of DateOffsets to Series not vectorized
  PerformanceWarning)

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-120-cb2fc6857acf> in <module>()
----> 1 df.end - df.beg

/Users/guillaumethomas/Documents/project/env3.4/lib/python3.4/site-packages/pandas/core/ops.py in wrapper(left, right, name, na_op)
    607                     rvalues = com.take_1d(rvalues, ridx)
    608 
--> 609             arr = na_op(lvalues, rvalues)
    610 
    611             return left._constructor(wrap_results(arr), index=index,

/Users/guillaumethomas/Documents/project/env3.4/lib/python3.4/site-packages/pandas/core/ops.py in <lambda>(x, y)
    452 
    453                 # pass thru on the na_op
--> 454                 self.na_op = lambda x, y: getattr(x,self.name)(y)
    455                 return lvalues, rvalues
    456 

TypeError: ufunc subtract cannot use operands with types dtype('<M8[ns]') and dtype('O')

这有效

In [121]: df.end.sub(df.beg)
Out[121]: Series([], dtype: timedelta64[ns])

根据documentationsub是“等同于series - other,但支持将fill_value替换为其中一个输入中的缺失数据。”据我所知,它并没有解释行为的差异。我的问题是:

  • 这是一个错误吗?
  • 文档中未说明的sub方法和减号运算符之间有什么区别?
  • 始终使用subadd等代替运营商是一种好习惯吗?就我而言,我优先考虑可预测性而不是可读性。

我的环境:

  • python 3.4.3
  • pandas 0.17.1

1 个答案:

答案 0 :(得分:0)

在您复制粘贴的文档和句子中回答:

  

但支持将fill_value替换为其中一个输入中的缺失数据

它支持空数据帧和缺失数据,其中减号运算符不是。
使用pandas和numpy,使用您正在使用的对象的成员函数是一种很好的做法。