Skip to content

Commit 5d10aa4

Browse files
jbrockmendeljreback
authored andcommitted
BUG: Fix fields functions with readonly data, vaex#357 (#27529)
* Fix fields functions with readonly data, vaex#357 * lint fixup * add whatsnew * isort
1 parent 0b02137 commit 5d10aa4

File tree

3 files changed

+37
-6
lines changed

3 files changed

+37
-6
lines changed

doc/source/whatsnew/v1.0.0.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ Categorical
8989
Datetimelike
9090
^^^^^^^^^^^^
9191
- Bug in :meth:`Series.__setitem__` incorrectly casting ``np.timedelta64("NaT")`` to ``np.datetime64("NaT")`` when inserting into a :class:`Series` with datetime64 dtype (:issue:`27311`)
92-
-
92+
- Bug in :meth:`Series.dt` property lookups when the underlying data is read-only (:issue:`27529`)
9393
-
9494

9595

pandas/_libs/tslibs/fields.pyx

+5-5
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def get_time_micros(ndarray[int64_t] dtindex):
4545

4646
@cython.wraparound(False)
4747
@cython.boundscheck(False)
48-
def build_field_sarray(int64_t[:] dtindex):
48+
def build_field_sarray(const int64_t[:] dtindex):
4949
"""
5050
Datetime as int64 representation to a structured array of fields
5151
"""
@@ -87,7 +87,7 @@ def build_field_sarray(int64_t[:] dtindex):
8787

8888
@cython.wraparound(False)
8989
@cython.boundscheck(False)
90-
def get_date_name_field(int64_t[:] dtindex, object field, object locale=None):
90+
def get_date_name_field(const int64_t[:] dtindex, object field, object locale=None):
9191
"""
9292
Given a int64-based datetime index, return array of strings of date
9393
name based on requested field (e.g. weekday_name)
@@ -137,7 +137,7 @@ def get_date_name_field(int64_t[:] dtindex, object field, object locale=None):
137137

138138
@cython.wraparound(False)
139139
@cython.boundscheck(False)
140-
def get_start_end_field(int64_t[:] dtindex, object field,
140+
def get_start_end_field(const int64_t[:] dtindex, object field,
141141
object freqstr=None, int month_kw=12):
142142
"""
143143
Given an int64-based datetime index return array of indicators
@@ -380,7 +380,7 @@ def get_start_end_field(int64_t[:] dtindex, object field,
380380

381381
@cython.wraparound(False)
382382
@cython.boundscheck(False)
383-
def get_date_field(int64_t[:] dtindex, object field):
383+
def get_date_field(const int64_t[:] dtindex, object field):
384384
"""
385385
Given a int64-based datetime index, extract the year, month, etc.,
386386
field and return an array of these values.
@@ -542,7 +542,7 @@ def get_date_field(int64_t[:] dtindex, object field):
542542

543543
@cython.wraparound(False)
544544
@cython.boundscheck(False)
545-
def get_timedelta_field(int64_t[:] tdindex, object field):
545+
def get_timedelta_field(const int64_t[:] tdindex, object field):
546546
"""
547547
Given a int64-based timedelta index, extract the days, hrs, sec.,
548548
field and return an array of these values.

pandas/tests/tslibs/test_fields.py

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import numpy as np
2+
3+
from pandas._libs.tslibs import fields
4+
5+
import pandas.util.testing as tm
6+
7+
8+
def test_fields_readonly():
9+
# https://github.com/vaexio/vaex/issues/357
10+
# fields functions should't raise when we pass read-only data
11+
dtindex = np.arange(5, dtype=np.int64) * 10 ** 9 * 3600 * 24 * 32
12+
dtindex.flags.writeable = False
13+
14+
result = fields.get_date_name_field(dtindex, "month_name")
15+
expected = np.array(
16+
["January", "February", "March", "April", "May"], dtype=np.object
17+
)
18+
tm.assert_numpy_array_equal(result, expected)
19+
20+
result = fields.get_date_field(dtindex, "Y")
21+
expected = np.array([1970, 1970, 1970, 1970, 1970], dtype=np.int32)
22+
tm.assert_numpy_array_equal(result, expected)
23+
24+
result = fields.get_start_end_field(dtindex, "is_month_start", None)
25+
expected = np.array([True, False, False, False, False], dtype=np.bool_)
26+
tm.assert_numpy_array_equal(result, expected)
27+
28+
# treat dtindex as timedeltas for this next one
29+
result = fields.get_timedelta_field(dtindex, "days")
30+
expected = np.arange(5, dtype=np.int32) * 32
31+
tm.assert_numpy_array_equal(result, expected)

0 commit comments

Comments
 (0)