Skip to content

Commit 50ea0f7

Browse files
authored
feat: rename dbtime and dbdate dtypes to avoid future conflicts with pandas (#32)
1 parent cf06ae8 commit 50ea0f7

File tree

7 files changed

+54
-51
lines changed

7 files changed

+54
-51
lines changed

db_dtypes/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@
3434
from db_dtypes import core
3535

3636

37-
date_dtype_name = "date"
38-
time_dtype_name = "time"
37+
date_dtype_name = "dbdate"
38+
time_dtype_name = "dbtime"
3939

4040
pandas_release = packaging.version.parse(pandas.__version__).release
4141

samples/snippets/pandas_date_and_time.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,13 @@
1414

1515

1616
def pandas_date_and_time():
17-
# fmt: off
1817
# [START bigquery_date_create]
1918

2019
import datetime
2120
import pandas as pd
2221
import db_dtypes # noqa import to register dtypes
2322

24-
dates = pd.Series(
25-
[datetime.date(2021, 9, 17), '2021-9-18'],
26-
dtype='date')
23+
dates = pd.Series([datetime.date(2021, 9, 17), "2021-9-18"], dtype="dbdate")
2724

2825
# [END bigquery_date_create]
2926
# [START bigquery_date_as_datetime]
@@ -33,7 +30,7 @@ def pandas_date_and_time():
3330
# [END bigquery_date_as_datetime]
3431
# [START bigquery_date_sub]
3532

36-
dates2 = pd.Series(['2021-1-1', '2021-1-2'], dtype='date')
33+
dates2 = pd.Series(["2021-1-1", "2021-1-2"], dtype="dbdate")
3734
diffs = dates - dates2
3835

3936
# [END bigquery_date_sub]
@@ -46,9 +43,7 @@ def pandas_date_and_time():
4643
# [END bigquery_date_do]
4744
# [START bigquery_time_create]
4845

49-
times = pd.Series(
50-
[datetime.time(1, 2, 3, 456789), '12:00:00.6'],
51-
dtype='time')
46+
times = pd.Series([datetime.time(1, 2, 3, 456789), "12:00:00.6"], dtype="dbtime")
5247

5348
# [END bigquery_time_create]
5449
# [START bigquery_time_as_timedelta]
@@ -67,7 +62,6 @@ def pandas_date_and_time():
6762
combined = dates + times
6863

6964
# [END bigquery_combine2_date_time]
70-
# fmt: on
7165

7266
return (
7367
dates,

samples/snippets/pandas_date_and_time_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def test_pandas_date_and_time():
3535
combined0,
3636
) = pandas_date_and_time()
3737

38-
assert str(dates.dtype) == "date"
38+
assert str(dates.dtype) == "dbdate"
3939
assert list(dates) == [datetime.date(2021, 9, 17), datetime.date(2021, 9, 18)]
4040

4141
assert np.array_equal(
@@ -45,7 +45,7 @@ def test_pandas_date_and_time():
4545
assert np.array_equal(after, dates.astype("object") + do)
4646
assert np.array_equal(before, dates.astype("object") - do)
4747

48-
assert str(times.dtype) == "time"
48+
assert str(times.dtype) == "dbtime"
4949
assert list(times) == [
5050
datetime.time(1, 2, 3, 456789),
5151
datetime.time(12, 0, 0, 600000),

tests/unit/test_arrow.py

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@
2525
@pytest.mark.parametrize(
2626
("series", "expected"),
2727
(
28-
(pandas.Series([], dtype="date"), pyarrow.array([], type=pyarrow.date32())),
28+
(pandas.Series([], dtype="dbdate"), pyarrow.array([], type=pyarrow.date32())),
2929
(
30-
pandas.Series([None, None, None], dtype="date"),
30+
pandas.Series([None, None, None], dtype="dbdate"),
3131
pyarrow.array([None, None, None], type=pyarrow.date32()),
3232
),
3333
(
3434
pandas.Series(
35-
[dt.date(2021, 9, 27), None, dt.date(2011, 9, 27)], dtype="date"
35+
[dt.date(2021, 9, 27), None, dt.date(2011, 9, 27)], dtype="dbdate"
3636
),
3737
pyarrow.array(
3838
[dt.date(2021, 9, 27), None, dt.date(2011, 9, 27)],
@@ -42,21 +42,25 @@
4242
(
4343
pandas.Series(
4444
[dt.date(1677, 9, 22), dt.date(1970, 1, 1), dt.date(2262, 4, 11)],
45-
dtype="date",
45+
dtype="dbdate",
4646
),
4747
pyarrow.array(
4848
[dt.date(1677, 9, 22), dt.date(1970, 1, 1), dt.date(2262, 4, 11)],
4949
type=pyarrow.date32(),
5050
),
5151
),
52-
(pandas.Series([], dtype="time"), pyarrow.array([], type=pyarrow.time64("ns"))),
5352
(
54-
pandas.Series([None, None, None], dtype="time"),
53+
pandas.Series([], dtype="dbtime"),
54+
pyarrow.array([], type=pyarrow.time64("ns")),
55+
),
56+
(
57+
pandas.Series([None, None, None], dtype="dbtime"),
5558
pyarrow.array([None, None, None], type=pyarrow.time64("ns")),
5659
),
5760
(
5861
pandas.Series(
59-
[dt.time(0, 0, 0, 0), None, dt.time(23, 59, 59, 999_999)], dtype="time"
62+
[dt.time(0, 0, 0, 0), None, dt.time(23, 59, 59, 999_999)],
63+
dtype="dbtime",
6064
),
6165
pyarrow.array(
6266
[dt.time(0, 0, 0, 0), None, dt.time(23, 59, 59, 999_999)],
@@ -70,7 +74,7 @@
7074
dt.time(12, 30, 15, 125_000),
7175
dt.time(23, 59, 59, 999_999),
7276
],
73-
dtype="time",
77+
dtype="dbtime",
7478
),
7579
pyarrow.array(
7680
[
@@ -91,14 +95,14 @@ def test_to_arrow(series, expected):
9195
@pytest.mark.parametrize(
9296
("series", "expected"),
9397
(
94-
(pandas.Series([], dtype="date"), pyarrow.array([], type=pyarrow.date64())),
98+
(pandas.Series([], dtype="dbdate"), pyarrow.array([], type=pyarrow.date64())),
9599
(
96-
pandas.Series([None, None, None], dtype="date"),
100+
pandas.Series([None, None, None], dtype="dbdate"),
97101
pyarrow.array([None, None, None], type=pyarrow.date64()),
98102
),
99103
(
100104
pandas.Series(
101-
[dt.date(2021, 9, 27), None, dt.date(2011, 9, 27)], dtype="date"
105+
[dt.date(2021, 9, 27), None, dt.date(2011, 9, 27)], dtype="dbdate"
102106
),
103107
pyarrow.array(
104108
[dt.date(2021, 9, 27), None, dt.date(2011, 9, 27)],
@@ -108,21 +112,25 @@ def test_to_arrow(series, expected):
108112
(
109113
pandas.Series(
110114
[dt.date(1677, 9, 22), dt.date(1970, 1, 1), dt.date(2262, 4, 11)],
111-
dtype="date",
115+
dtype="dbdate",
112116
),
113117
pyarrow.array(
114118
[dt.date(1677, 9, 22), dt.date(1970, 1, 1), dt.date(2262, 4, 11)],
115119
type=pyarrow.date64(),
116120
),
117121
),
118-
(pandas.Series([], dtype="time"), pyarrow.array([], type=pyarrow.time32("ms"))),
119122
(
120-
pandas.Series([None, None, None], dtype="time"),
123+
pandas.Series([], dtype="dbtime"),
124+
pyarrow.array([], type=pyarrow.time32("ms")),
125+
),
126+
(
127+
pandas.Series([None, None, None], dtype="dbtime"),
121128
pyarrow.array([None, None, None], type=pyarrow.time32("ms")),
122129
),
123130
(
124131
pandas.Series(
125-
[dt.time(0, 0, 0, 0), None, dt.time(23, 59, 59, 999_000)], dtype="time"
132+
[dt.time(0, 0, 0, 0), None, dt.time(23, 59, 59, 999_000)],
133+
dtype="dbtime",
126134
),
127135
pyarrow.array(
128136
[dt.time(0, 0, 0, 0), None, dt.time(23, 59, 59, 999_000)],
@@ -131,7 +139,8 @@ def test_to_arrow(series, expected):
131139
),
132140
(
133141
pandas.Series(
134-
[dt.time(0, 0, 0, 0), None, dt.time(23, 59, 59, 999_999)], dtype="time"
142+
[dt.time(0, 0, 0, 0), None, dt.time(23, 59, 59, 999_999)],
143+
dtype="dbtime",
135144
),
136145
pyarrow.array(
137146
[dt.time(0, 0, 0, 0), None, dt.time(23, 59, 59, 999_999)],
@@ -145,7 +154,7 @@ def test_to_arrow(series, expected):
145154
dt.time(12, 30, 15, 125_000),
146155
dt.time(23, 59, 59, 999_999),
147156
],
148-
dtype="time",
157+
dtype="dbtime",
149158
),
150159
pyarrow.array(
151160
[

tests/unit/test_date.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
],
3939
)
4040
def test_date_parsing(value, expected):
41-
assert pandas.Series([value], dtype="date")[0] == expected
41+
assert pandas.Series([value], dtype="dbdate")[0] == expected
4242

4343

4444
@pytest.mark.parametrize(
@@ -59,4 +59,4 @@ def test_date_parsing(value, expected):
5959
)
6060
def test_date_parsing_errors(value, error):
6161
with pytest.raises(ValueError, match=error):
62-
pandas.Series([value], dtype="date")
62+
pandas.Series([value], dtype="dbdate")

tests/unit/test_dtypes.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,39 +23,39 @@
2323
pandas_release = packaging.version.parse(pd.__version__).release
2424

2525
SAMPLE_RAW_VALUES = dict(
26-
date=(datetime.date(2021, 2, 2), "2021-2-3", None),
27-
time=(datetime.time(1, 2, 2), "1:2:3.5", None),
26+
dbdate=(datetime.date(2021, 2, 2), "2021-2-3", None),
27+
dbtime=(datetime.time(1, 2, 2), "1:2:3.5", None),
2828
)
2929
SAMPLE_VALUES = dict(
30-
date=(
30+
dbdate=(
3131
datetime.date(2021, 2, 2),
3232
datetime.date(2021, 2, 3),
3333
datetime.date(2021, 2, 4),
3434
datetime.date(2021, 2, 5),
3535
),
36-
time=(
36+
dbtime=(
3737
datetime.time(1, 2, 2),
3838
datetime.time(1, 2, 3, 500000),
3939
datetime.time(1, 2, 4, 500000),
4040
datetime.time(1, 2, 5, 500000),
4141
),
4242
)
4343
SAMPLE_DT_VALUES = dict(
44-
date=(
44+
dbdate=(
4545
"2021-02-02T00:00:00.000000",
4646
"2021-02-03T00:00:00.000000",
4747
"2021-02-04T00:00:00.000000",
4848
"2021-02-05T00:00:00.000000",
4949
),
50-
time=(
50+
dbtime=(
5151
"1970-01-01T01:02:02.000000",
5252
"1970-01-01T01:02:03.500000",
5353
"1970-01-01T01:02:04.500000",
5454
"1970-01-01T01:02:05.500000",
5555
),
5656
)
5757

58-
for_date_and_time = pytest.mark.parametrize("dtype", ["date", "time"])
58+
for_date_and_time = pytest.mark.parametrize("dtype", ["dbdate", "dbtime"])
5959

6060

6161
def eq_na(a1, a2):
@@ -72,7 +72,7 @@ def register_dtype():
7272
def _cls(dtype):
7373
import db_dtypes
7474

75-
return getattr(db_dtypes, dtype.capitalize() + "Array")
75+
return getattr(db_dtypes, dtype[2:].capitalize() + "Array")
7676

7777

7878
def _make_one(dtype):
@@ -322,7 +322,7 @@ def test_take(dtype, allow_fill, fill_value):
322322
if fill_value == 42:
323323
fill_value = expected_fill = (
324324
datetime.date(1971, 4, 2)
325-
if dtype == "date"
325+
if dtype == "dbdate"
326326
else datetime.time(0, 42, 42, 424242)
327327
)
328328
else:
@@ -441,7 +441,7 @@ def test_astype_copy(dtype):
441441
],
442442
)
443443
def test_asdatetime(dtype, same):
444-
a = _make_one("date")
444+
a = _make_one("dbdate")
445445
for dt in dtype, np.dtype(dtype) if dtype != "datetime" else dtype:
446446
if same:
447447
b = a.astype(dt, copy=False)
@@ -480,7 +480,7 @@ def test_astimedelta(dtype):
480480
.astype("timedelta64[ns]" if dtype == "timedelta" else dtype)
481481
)
482482

483-
a = _cls("time")([t, None])
483+
a = _cls("dbtime")([t, None])
484484
b = a.astype(dtype)
485485
np.array_equal(b[:1], expect)
486486
assert pd.isna(b[1]) and str(b[1]) == "NaT"
@@ -526,7 +526,7 @@ def test_min_max_median(dtype):
526526
if pandas_release >= (1, 2):
527527
assert (
528528
a.median() == datetime.time(1, 2, 4)
529-
if dtype == "time"
529+
if dtype == "dbtime"
530530
else datetime.date(2021, 2, 3)
531531
)
532532

@@ -553,14 +553,14 @@ def test_min_max_median(dtype):
553553
if pandas_release >= (1, 2):
554554
assert (
555555
a.median() == datetime.time(1, 2, 2, 750000)
556-
if dtype == "time"
556+
if dtype == "dbtime"
557557
else datetime.date(2021, 2, 2)
558558
)
559559

560560

561561
def test_date_add():
562-
dates = _cls("date")(SAMPLE_VALUES["date"])
563-
times = _cls("time")(SAMPLE_VALUES["time"])
562+
dates = _cls("dbdate")(SAMPLE_VALUES["dbdate"])
563+
times = _cls("dbtime")(SAMPLE_VALUES["dbtime"])
564564
expect = dates.astype("datetime64") + times.astype("timedelta64")
565565

566566
assert np.array_equal(dates + times, expect)
@@ -592,8 +592,8 @@ def test_date_add():
592592

593593

594594
def test_date_sub():
595-
dates = _cls("date")(SAMPLE_VALUES["date"])
596-
dates2 = _cls("date")(
595+
dates = _cls("dbdate")(SAMPLE_VALUES["dbdate"])
596+
dates2 = _cls("dbdate")(
597597
(
598598
datetime.date(2021, 1, 2),
599599
datetime.date(2021, 1, 3),

tests/unit/test_time.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
],
6262
)
6363
def test_time_parsing(value, expected):
64-
assert pandas.Series([value], dtype="time")[0] == expected
64+
assert pandas.Series([value], dtype="dbtime")[0] == expected
6565

6666

6767
@pytest.mark.parametrize(
@@ -81,4 +81,4 @@ def test_time_parsing(value, expected):
8181
)
8282
def test_time_parsing_errors(value, error):
8383
with pytest.raises(ValueError, match=error):
84-
pandas.Series([value], dtype="time")
84+
pandas.Series([value], dtype="dbtime")

0 commit comments

Comments
 (0)