diff --git a/python/pyarrow/scalar.pxi b/python/pyarrow/scalar.pxi index 863ab2b66a8..863c26e0fdd 100644 --- a/python/pyarrow/scalar.pxi +++ b/python/pyarrow/scalar.pxi @@ -671,6 +671,19 @@ cdef class Date32Scalar(Scalar): else: return None + def __repr__(self): + try: + return Scalar.__repr__(self) + except OverflowError: + value = frombytes(self.wrapped.get().ToString()) + return f'' + + def __str__(self): + try: + return Scalar.__str__(self) + except OverflowError: + return frombytes(self.wrapped.get().ToString()) + cdef class Date64Scalar(Scalar): """ @@ -702,6 +715,19 @@ cdef class Date64Scalar(Scalar): else: return None + def __repr__(self): + try: + return Scalar.__repr__(self) + except OverflowError: + value = frombytes(self.wrapped.get().ToString()) + return f'' + + def __str__(self): + try: + return Scalar.__str__(self) + except OverflowError: + return frombytes(self.wrapped.get().ToString()) + def _datetime_from_int(int64_t value, TimeUnit unit, tzinfo=None): if unit == TimeUnit_SECOND: diff --git a/python/pyarrow/tests/test_scalars.py b/python/pyarrow/tests/test_scalars.py index 08f9fcd55ce..4b6bbe0289d 100644 --- a/python/pyarrow/tests/test_scalars.py +++ b/python/pyarrow/tests/test_scalars.py @@ -136,6 +136,34 @@ def test_basics_np_required(pickle_module): assert wr() is None +@pytest.mark.parametrize(('value', 'ty'), [ + (-(2 ** 31), pa.date32()), + (2 ** 31 - 1, pa.date32()), + (-(2 ** 63), pa.date64()), + (2 ** 63 - 1, pa.date64()), +]) +def test_date_scalar_repr_outside_python_range(value, ty): + scalar = pa.scalar(value, type=ty) + out_of_range = f'' + + assert str(scalar) == out_of_range + assert repr(scalar) == ( + f'' + ) + + +@pytest.mark.parametrize('ty', [pa.date32(), pa.date64()]) +def test_date_scalar_repr_in_python_range(ty): + scalar = pa.scalar(datetime.date(2020, 2, 29), type=ty) + + assert str(scalar) == '2020-02-29' + assert repr(scalar) == ( + ''.format( + scalar.__class__.__name__ + ) + ) + + def test_invalid_scalar(): s = pc.cast(pa.scalar(b"\xff"), pa.string(), safe=False) s.validate()