randolf-scholz opened a new issue, #39233:
URL: https://github.com/apache/arrow/issues/39233

   ### Describe the enhancement requested
   
   There are lots of kernels missing on the duration type for feature-parity 
with e.g. `numpy.timedelta64`. Since duration types are basically just wrapped 
integers, most of the integer kernels should be transferrable, with some 
exceptions (e.g. `prod` does not make sense since it would change the physical 
units)
   
   
   <details><summary> I ran a script to figure out what is currently supported. 
</summary>
   
   ```python
   import pyarrow as pa
   from pyarrow.lib import ArrowNotImplementedError
   
   i8 = pa.int8()
   i64 = pa.int64()
   i32 = pa.int32()
   f64 = pa.float64()
   td64 = pa.duration("s")
   b = pa.bool_()
   
   duration_arr = pa.array([-3, 2, -1, 1], type=td64)
   int_arr = pa.array([-3, 2, -1, 1], type=i64)
   float_arr = pa.array([-3, 2, -1, 1], type=f64)
   
   # td64 = pa.int64()
   # duration_arr = pa.array([-3, 2, -1, 1], type=i64)
   
   unary_ops = [
       (pa.compute.negate, duration_arr, td64),
       (pa.compute.negate_checked, duration_arr, td64),
       (pa.compute.abs, duration_arr, td64),
       (pa.compute.abs_checked, duration_arr, td64),
       (pa.compute.sign, duration_arr, i8),
       # tests
       (pa.compute.is_null, duration_arr, b),
       (pa.compute.is_valid, duration_arr, b),
       (pa.compute.is_finite, duration_arr, b),
       (pa.compute.is_inf, duration_arr, b),
       (pa.compute.is_nan, duration_arr, b),
       (pa.compute.true_unless_null, duration_arr, b),
       # aggregations
       (pa.compute.max, duration_arr, td64),
       (pa.compute.min, duration_arr, td64),
       (pa.compute.sum, duration_arr, td64),
       # (pa.compute.min_max, duration_arr, td64),  # returns tuple
       # (pa.compute.quantile, duration_arr, td64),  # float for int
       # (pa.compute.approximate_median, duration_arr, td64),  # float for int
       # cumulative aggregations
       (pa.compute.cumulative_sum, duration_arr, td64),
       (pa.compute.cumulative_sum_checked, duration_arr, td64),
       (pa.compute.cumulative_min, duration_arr, td64),
       (pa.compute.cumulative_max, duration_arr, td64),
   ]
   
   
   for op, operand, dtype in unary_ops:
       try:
           result = op(operand)
       except ArrowNotImplementedError as e:
           print(f" [ ] {op.__name__:<24}({operand.type!s:<11}) -> {dtype}")
       else:
           assert result.type == dtype, f"{op}: got {result.type} expected 
{dtype}"
           print(f" [x] {op.__name__:<24}({operand.type!s:<11}) -> {dtype}")
   
   
   binary_ops = [
       # arithmetic
       (pa.compute.add, duration_arr, duration_arr, td64),
       (pa.compute.add_checked, duration_arr, int_arr, td64),
       (pa.compute.subtract, duration_arr, duration_arr, td64),
       (pa.compute.subtract_checked, duration_arr, int_arr, td64),
       (pa.compute.multiply, duration_arr, int_arr, td64),
       (pa.compute.multiply_checked, duration_arr, int_arr, td64),
       (pa.compute.divide, duration_arr, duration_arr, f64),
       (pa.compute.divide, duration_arr, int_arr, td64),
       (pa.compute.divide_checked, duration_arr, duration_arr, f64),
       (pa.compute.divide_checked, duration_arr, int_arr, td64),
       # comparisons
       (pa.compute.less, duration_arr, duration_arr, b),
       (pa.compute.less_equal, duration_arr, duration_arr, b),
       (pa.compute.greater, duration_arr, duration_arr, b),
       (pa.compute.greater_equal, duration_arr, duration_arr, b),
       (pa.compute.equal, duration_arr, duration_arr, b),
       (pa.compute.not_equal, duration_arr, duration_arr, b),
       # min/max
       (pa.compute.max_element_wise, duration_arr, duration_arr, td64),
       (pa.compute.min_element_wise, duration_arr, duration_arr, td64),
       # containment
       (pa.compute.is_in, duration_arr, duration_arr, b),
       (pa.compute.index_in, duration_arr, duration_arr, i32),
   ]
   
   for op, lhs, rhs, dtype in binary_ops:
       try:
           result = op(lhs, rhs)
       except ArrowNotImplementedError as e:
           print(f" [ ] {op.__name__:<20}({lhs.type!s:<11}, {rhs.type!s:<11}) 
-> {dtype}")
       else:
           assert result.type == dtype, f"{op}: got {result.type} expected 
{dtype}"
           print(f" [x] {op.__name__:<20}({lhs.type!s:<11}, {rhs.type!s:<11}) 
-> {dtype}")
   ```
   
   
   
   </details>
   
   - [ ] negate                  (duration[s]) -> duration[s]
   - [ ] negate_checked          (duration[s]) -> duration[s]
   - [ ] abs                     (duration[s]) -> duration[s]
   - [ ] abs_checked             (duration[s]) -> duration[s]
   - [ ] sign                    (duration[s]) -> int8
   - [x] is_null                 (duration[s]) -> bool
   - [x] is_valid                (duration[s]) -> bool
   - [ ] is_finite               (duration[s]) -> bool
   - [ ] is_inf                  (duration[s]) -> bool
   - [ ] is_nan                  (duration[s]) -> bool
   - [x] true_unless_null        (duration[s]) -> bool
   - [ ] max                     (duration[s]) -> duration[s]
   - [ ] min                     (duration[s]) -> duration[s]
   - [ ] sum                     (duration[s]) -> duration[s]
   - [ ] cumulative_sum          (duration[s]) -> duration[s]
   - [ ] cumulative_sum_checked  (duration[s]) -> duration[s]
   - [ ] cumulative_min          (duration[s]) -> duration[s]
   - [ ] cumulative_max          (duration[s]) -> duration[s]
   - [x] add                 (duration[s], duration[s]) -> duration[s]
   - [ ] add_checked         (duration[s], int64      ) -> duration[s]
   - [x] subtract            (duration[s], duration[s]) -> duration[s]
   - [ ] subtract_checked    (duration[s], int64      ) -> duration[s]
   - [x] multiply            (duration[s], int64      ) -> duration[s]
   - [x] multiply_checked    (duration[s], int64      ) -> duration[s]
   - [x] divide              (duration[s], duration[s]) -> double
   - [x] divide              (duration[s], int64      ) -> duration[s]
   - [x] divide_checked      (duration[s], duration[s]) -> double
   - [x] divide_checked      (duration[s], int64      ) -> duration[s]
   - [x] less                (duration[s], duration[s]) -> bool
   - [x] less_equal          (duration[s], duration[s]) -> bool
   - [x] greater             (duration[s], duration[s]) -> bool
   - [x] greater_equal       (duration[s], duration[s]) -> bool
   - [x] equal               (duration[s], duration[s]) -> bool
   - [x] not_equal           (duration[s], duration[s]) -> bool
   - [ ] max_element_wise    (duration[s], duration[s]) -> duration[s]
   - [ ] min_element_wise    (duration[s], duration[s]) -> duration[s]
   - [x] is_in               (duration[s], duration[s]) -> bool
   - [x] index_in            (duration[s], duration[s]) -> int32
   
   
   
   
   
   
   
   ### Component(s)
   
   C++


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to