Skip to content

Commit bcb3d20

Browse files
committed
create test_nat.py & consolidate tests
1 parent 50ed3ea commit bcb3d20

File tree

5 files changed

+294
-287
lines changed

5 files changed

+294
-287
lines changed

pandas/tests/scalar/common.py

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
""" scalar common ops """
2+
3+
4+
class Base(object):
5+
6+
# all accessors fields
7+
_field_accessors = ['year', 'month', 'day', 'hour', 'minute', 'second',
8+
'microsecond', 'nanosecond', 'dayofweek', 'quarter',
9+
'dayofyear', 'week', 'daysinmonth', 'days_in_month']
10+
_bool_accessors = ['is_month_start', 'is_quarter_start', 'is_year_start',
11+
'is_month_end', 'is_quarter_end', 'is_year_end',
12+
'is_leap_year']

pandas/tests/scalar/test_nat.py

+240
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
import pytest
2+
3+
from datetime import datetime, timedelta
4+
import pytz
5+
6+
import numpy as np
7+
from pandas import (NaT, Timestamp, Timedelta, Period, DatetimeIndex,
8+
TimedeltaIndex, Series, isnull)
9+
from pandas.util import testing as tm
10+
from pandas._libs.tslib import iNaT
11+
from .common import Base
12+
13+
14+
class TestNaT(Base):
15+
16+
def test_nat_for_period(self):
17+
p = Period('NaT', freq='M')
18+
19+
# confirm Period('NaT') work identical with Timestamp('NaT')
20+
for f in ['year', 'month', 'day', 'hour', 'minute', 'second', 'week',
21+
'dayofyear', 'quarter', 'days_in_month']:
22+
assert np.isnan(getattr(p, f))
23+
24+
def test_nat_fields(self):
25+
# GH 10050
26+
ts = Timestamp('NaT')
27+
28+
for field in self._field_accessors:
29+
30+
result = getattr(NaT, field)
31+
assert np.isnan(result)
32+
33+
result = getattr(ts, field)
34+
assert np.isnan(result)
35+
36+
for field in self._bool_accessors:
37+
38+
result = getattr(NaT, field)
39+
assert result is False
40+
41+
result = getattr(ts, field)
42+
assert result is False
43+
44+
def test_nat_vector_field_access(self):
45+
idx = DatetimeIndex(['1/1/2000', None, None, '1/4/2000'])
46+
47+
for field in self._field_accessors:
48+
result = getattr(idx, field)
49+
expected = [getattr(x, field) for x in idx]
50+
tm.assert_numpy_array_equal(result, np.array(expected))
51+
52+
s = Series(idx)
53+
54+
for field in self._field_accessors:
55+
result = getattr(s.dt, field)
56+
expected = [getattr(x, field) for x in idx]
57+
tm.assert_series_equal(result, Series(expected))
58+
59+
for field in self._bool_accessors:
60+
result = getattr(s.dt, field)
61+
expected = [getattr(x, field) for x in idx]
62+
tm.assert_series_equal(result, Series(expected))
63+
64+
65+
@pytest.mark.parametrize('klass', [Timestamp, Timedelta, Period])
66+
def test_identity(klass):
67+
assert klass(None) is NaT
68+
69+
result = klass(np.nan)
70+
assert result is NaT
71+
72+
result = klass(None)
73+
assert result is NaT
74+
75+
result = klass(iNaT)
76+
assert result is NaT
77+
78+
result = klass(np.nan)
79+
assert result is NaT
80+
81+
result = klass(float('nan'))
82+
assert result is NaT
83+
84+
result = klass(NaT)
85+
assert result is NaT
86+
87+
result = klass('NaT')
88+
assert result is NaT
89+
90+
assert isnull(klass('nat'))
91+
92+
93+
@pytest.mark.parametrize('klass', [Timestamp, Timedelta, Period])
94+
def test_equality(klass):
95+
96+
# nat
97+
if klass is not Period:
98+
klass('').value == iNaT
99+
klass('nat').value == iNaT
100+
klass('NAT').value == iNaT
101+
klass(None).value == iNaT
102+
klass(np.nan).value == iNaT
103+
assert isnull(klass('nat'))
104+
105+
106+
@pytest.mark.parametrize('klass', [Timestamp, Timedelta])
107+
def test_round_nat(klass):
108+
# GH14940
109+
ts = klass('nat')
110+
for method in ["round", "floor", "ceil"]:
111+
round_method = getattr(ts, method)
112+
for freq in ["s", "5s", "min", "5min", "h", "5h"]:
113+
assert round_method(freq) is ts
114+
115+
116+
def test_NaT_methods():
117+
# GH 9513
118+
raise_methods = ['astimezone', 'combine', 'ctime', 'dst',
119+
'fromordinal', 'fromtimestamp', 'isocalendar',
120+
'strftime', 'strptime', 'time', 'timestamp',
121+
'timetuple', 'timetz', 'toordinal', 'tzname',
122+
'utcfromtimestamp', 'utcnow', 'utcoffset',
123+
'utctimetuple']
124+
nat_methods = ['date', 'now', 'replace', 'to_datetime', 'today']
125+
nan_methods = ['weekday', 'isoweekday']
126+
127+
for method in raise_methods:
128+
if hasattr(NaT, method):
129+
with pytest.raises(ValueError):
130+
getattr(NaT, method)()
131+
132+
for method in nan_methods:
133+
if hasattr(NaT, method):
134+
assert np.isnan(getattr(NaT, method)())
135+
136+
for method in nat_methods:
137+
if hasattr(NaT, method):
138+
# see gh-8254
139+
exp_warning = None
140+
if method == 'to_datetime':
141+
exp_warning = FutureWarning
142+
with tm.assert_produces_warning(
143+
exp_warning, check_stacklevel=False):
144+
assert getattr(NaT, method)() is NaT
145+
146+
# GH 12300
147+
assert NaT.isoformat() == 'NaT'
148+
149+
150+
@pytest.mark.parametrize('klass', [Timestamp, Timedelta])
151+
def test_isoformat(klass):
152+
153+
result = klass('NaT').isoformat()
154+
expected = 'NaT'
155+
assert result == expected
156+
157+
158+
def test_nat_arithmetic():
159+
# GH 6873
160+
i = 2
161+
f = 1.5
162+
163+
for (left, right) in [(NaT, i), (NaT, f), (NaT, np.nan)]:
164+
assert left / right is NaT
165+
assert left * right is NaT
166+
assert right * left is NaT
167+
with pytest.raises(TypeError):
168+
right / left
169+
170+
# Timestamp / datetime
171+
t = Timestamp('2014-01-01')
172+
dt = datetime(2014, 1, 1)
173+
for (left, right) in [(NaT, NaT), (NaT, t), (NaT, dt)]:
174+
# NaT __add__ or __sub__ Timestamp-like (or inverse) returns NaT
175+
assert right + left is NaT
176+
assert left + right is NaT
177+
assert left - right is NaT
178+
assert right - left is NaT
179+
180+
# timedelta-like
181+
# offsets are tested in test_offsets.py
182+
183+
delta = timedelta(3600)
184+
td = Timedelta('5s')
185+
186+
for (left, right) in [(NaT, delta), (NaT, td)]:
187+
# NaT + timedelta-like returns NaT
188+
assert right + left is NaT
189+
assert left + right is NaT
190+
assert right - left is NaT
191+
assert left - right is NaT
192+
193+
# GH 11718
194+
t_utc = Timestamp('2014-01-01', tz='UTC')
195+
t_tz = Timestamp('2014-01-01', tz='US/Eastern')
196+
dt_tz = pytz.timezone('Asia/Tokyo').localize(dt)
197+
198+
for (left, right) in [(NaT, t_utc), (NaT, t_tz),
199+
(NaT, dt_tz)]:
200+
# NaT __add__ or __sub__ Timestamp-like (or inverse) returns NaT
201+
assert right + left is NaT
202+
assert left + right is NaT
203+
assert left - right is NaT
204+
assert right - left is NaT
205+
206+
# int addition / subtraction
207+
for (left, right) in [(NaT, 2), (NaT, 0), (NaT, -3)]:
208+
assert right + left is NaT
209+
assert left + right is NaT
210+
assert left - right is NaT
211+
assert right - left is NaT
212+
213+
214+
def test_nat_arithmetic_index():
215+
# GH 11718
216+
217+
dti = DatetimeIndex(['2011-01-01', '2011-01-02'], name='x')
218+
exp = DatetimeIndex([NaT, NaT], name='x')
219+
tm.assert_index_equal(dti + NaT, exp)
220+
tm.assert_index_equal(NaT + dti, exp)
221+
222+
dti_tz = DatetimeIndex(['2011-01-01', '2011-01-02'],
223+
tz='US/Eastern', name='x')
224+
exp = DatetimeIndex([NaT, NaT], name='x', tz='US/Eastern')
225+
tm.assert_index_equal(dti_tz + NaT, exp)
226+
tm.assert_index_equal(NaT + dti_tz, exp)
227+
228+
exp = TimedeltaIndex([NaT, NaT], name='x')
229+
for (left, right) in [(NaT, dti), (NaT, dti_tz)]:
230+
tm.assert_index_equal(left - right, exp)
231+
tm.assert_index_equal(right - left, exp)
232+
233+
# timedelta
234+
tdi = TimedeltaIndex(['1 day', '2 day'], name='x')
235+
exp = DatetimeIndex([NaT, NaT], name='x')
236+
for (left, right) in [(NaT, tdi)]:
237+
tm.assert_index_equal(left + right, exp)
238+
tm.assert_index_equal(right + left, exp)
239+
tm.assert_index_equal(left - right, exp)
240+
tm.assert_index_equal(right - left, exp)

pandas/tests/scalar/test_period.py

-25
Original file line numberDiff line numberDiff line change
@@ -110,20 +110,6 @@ def test_period_cons_nat(self):
110110
p = Period(tslib.iNaT)
111111
self.assertIs(p, pd.NaT)
112112

113-
def test_cons_null_like(self):
114-
# check Timestamp compat
115-
self.assertIs(Timestamp('NaT'), pd.NaT)
116-
self.assertIs(Period('NaT'), pd.NaT)
117-
118-
self.assertIs(Timestamp(None), pd.NaT)
119-
self.assertIs(Period(None), pd.NaT)
120-
121-
self.assertIs(Timestamp(float('nan')), pd.NaT)
122-
self.assertIs(Period(float('nan')), pd.NaT)
123-
124-
self.assertIs(Timestamp(np.nan), pd.NaT)
125-
self.assertIs(Period(np.nan), pd.NaT)
126-
127113
def test_period_cons_mult(self):
128114
p1 = Period('2011-01', freq='3M')
129115
p2 = Period('2011-01', freq='M')
@@ -854,17 +840,6 @@ def test_properties_secondly(self):
854840
self.assertEqual(Period(freq='Min', year=2012, month=2, day=1, hour=0,
855841
minute=0, second=0).days_in_month, 29)
856842

857-
def test_properties_nat(self):
858-
p_nat = Period('NaT', freq='M')
859-
t_nat = pd.Timestamp('NaT')
860-
self.assertIs(p_nat, t_nat)
861-
862-
# confirm Period('NaT') work identical with Timestamp('NaT')
863-
for f in ['year', 'month', 'day', 'hour', 'minute', 'second', 'week',
864-
'dayofyear', 'quarter', 'days_in_month']:
865-
self.assertTrue(np.isnan(getattr(p_nat, f)))
866-
self.assertTrue(np.isnan(getattr(t_nat, f)))
867-
868843
def test_pnow(self):
869844

870845
# deprecation, xref #13790

pandas/tests/scalar/test_timedelta.py

+1-14
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import pandas.util.testing as tm
77
from pandas.tseries.timedeltas import _coerce_scalar_to_timedelta_type as ct
88
from pandas import (Timedelta, TimedeltaIndex, timedelta_range, Series,
9-
to_timedelta, compat, isnull)
9+
to_timedelta, compat)
1010
from pandas._libs.tslib import iNaT, NaTType
1111

1212

@@ -151,14 +151,6 @@ def test_construction(self):
151151
500, 'ms').astype('m8[ns]').view('i8')
152152
self.assertEqual(Timedelta(10.5, unit='s').value, expected)
153153

154-
# nat
155-
self.assertEqual(Timedelta('').value, iNaT)
156-
self.assertEqual(Timedelta('nat').value, iNaT)
157-
self.assertEqual(Timedelta('NAT').value, iNaT)
158-
self.assertEqual(Timedelta(None).value, iNaT)
159-
self.assertEqual(Timedelta(np.nan).value, iNaT)
160-
self.assertTrue(isnull(Timedelta('nat')))
161-
162154
# offset
163155
self.assertEqual(to_timedelta(pd.offsets.Hour(2)),
164156
Timedelta('0 days, 02:00:00'))
@@ -686,11 +678,6 @@ def test_isoformat(self):
686678
expected = 'P0DT0H0M0.001S'
687679
self.assertEqual(result, expected)
688680

689-
# NaT
690-
result = Timedelta('NaT').isoformat()
691-
expected = 'NaT'
692-
self.assertEqual(result, expected)
693-
694681
# don't strip every 0
695682
result = Timedelta(minutes=1).isoformat()
696683
expected = 'P0DT0H1M0S'

0 commit comments

Comments
 (0)