Skip to content

Commit 963f99a

Browse files
committed
Manage timedelta, datetimetz and date
1 parent f93dc66 commit 963f99a

File tree

2 files changed

+40
-17
lines changed

2 files changed

+40
-17
lines changed

pandas/_libs/lib.pyx

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ from pandas._libs.missing cimport (
9696
is_null_datetime64,
9797
is_null_timedelta64,
9898
)
99+
from pandas._libs.tslibs.timestamps import Timestamp
100+
from pandas._libs.tslibs.timedeltas import Timedelta
101+
99102
from pandas._libs.tslibs.conversion cimport convert_to_tsobject
100103
from pandas._libs.tslibs.nattype cimport (
101104
NPY_NAT,
@@ -2615,7 +2618,10 @@ def maybe_convert_objects(ndarray[object] objects,
26152618
else:
26162619
seen.object_ = True
26172620
break
2618-
elif PyDate_Check(val):
2621+
elif (
2622+
PyDate_Check(val)
2623+
or (pa is not None and isinstance(val, (pa.Date32Scalar, pa.Date64Scalar)))
2624+
):
26192625
if convert_non_numeric:
26202626
seen.date_ = True
26212627
break
@@ -2668,12 +2674,16 @@ def maybe_convert_objects(ndarray[object] objects,
26682674
if storage == "pyarrow":
26692675
from pandas.core.dtypes.dtypes import ArrowDtype
26702676

2677+
datetime64_array = None
26712678
if isinstance(val, datetime):
26722679
objects[mask] = None
2680+
datetime64_array = objects.astype(Timestamp)
26732681
else:
26742682
objects[mask] = np.datetime64("NaT")
2675-
datetime64_array = objects.astype(val.dtype)
2676-
pa_array = pa.array(datetime64_array)
2683+
datetime64_array = objects.astype(val.dtype)
2684+
pa_array = pa.array(datetime64_array).cast(
2685+
pa.timestamp(val.resolution.unit, val.tzinfo)
2686+
)
26772687
dtype = ArrowDtype(pa_array.type)
26782688
return dtype.construct_array_type()._from_sequence(pa_array, dtype=dtype)
26792689

@@ -2727,17 +2737,32 @@ def maybe_convert_objects(ndarray[object] objects,
27272737
return dtype.construct_array_type()._from_sequence(pa_array, dtype=dtype)
27282738

27292739
elif seen.timedelta_:
2730-
if is_timedelta_or_timedelta64_array(objects):
2731-
from pandas import TimedeltaIndex
2740+
if storage == "pyarrow":
2741+
from pandas.core.dtypes.dtypes import ArrowDtype
27322742

2733-
try:
2734-
tdi = TimedeltaIndex(objects)
2735-
except OutOfBoundsTimedelta:
2736-
pass
2743+
timedelta64_array = None
2744+
if isinstance(val, timedelta):
2745+
objects[mask] = None
2746+
timedelta64_array = objects.astype(Timedelta)
27372747
else:
2738-
# unbox to ndarray[timedelta64[ns]]
2739-
return tdi._data._ndarray
2740-
seen.object_ = True
2748+
objects[mask] = np.timedelta64("NaT")
2749+
timedelta64_array = objects.astype(val.dtype)
2750+
pa_array = pa.array(timedelta64_array)
2751+
2752+
dtype = ArrowDtype(pa_array.type)
2753+
return dtype.construct_array_type()._from_sequence(pa_array, dtype=dtype)
2754+
else:
2755+
if is_timedelta_or_timedelta64_array(objects):
2756+
from pandas import TimedeltaIndex
2757+
2758+
try:
2759+
tdi = TimedeltaIndex(objects)
2760+
except OutOfBoundsTimedelta:
2761+
pass
2762+
else:
2763+
# unbox to ndarray[timedelta64[ns]]
2764+
return tdi._data._ndarray
2765+
seen.object_ = True
27412766

27422767
elif seen.period_:
27432768
if is_period_array(objects):

pandas/core/algorithms.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1703,13 +1703,11 @@ def map_array(
17031703
arr = cast("ExtensionArray", arr)
17041704
arr_dtype = arr.dtype.__repr__()
17051705
if "pyarrow" in arr_dtype:
1706-
if any(time_type in arr_dtype for time_type in ["duration"]):
1707-
values = arr.astype(object, copy=False)
1706+
storage = "pyarrow"
1707+
if "date" in arr_dtype:
1708+
values = np.fromiter(arr._pa_array, dtype='O')
17081709
else:
17091710
values = np.asarray(arr)
1710-
storage = "pyarrow"
1711-
else:
1712-
values = np.asarray(arr)
17131711
if arr._hasna:
17141712
na_value = arr.dtype.na_value
17151713
else:

0 commit comments

Comments
 (0)