Skip to content

Commit dfec43f

Browse files
committed
TST: test coverage pandas-dev#1245
1 parent 7b484e0 commit dfec43f

File tree

4 files changed

+97
-84
lines changed

4 files changed

+97
-84
lines changed

pandas/tseries/index.py

+17-81
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,6 @@ def _utc():
2525

2626
# -------- some conversion wrapper functions
2727

28-
def _as_i8(arg):
29-
if isinstance(arg, np.ndarray) and arg.dtype == np.datetime64:
30-
return arg.view('i8', type=np.ndarray)
31-
else:
32-
return arg
33-
3428

3529
def _field_accessor(name, field):
3630
def f(self):
@@ -43,19 +37,6 @@ def f(self):
4337
f.__name__ = name
4438
return property(f)
4539

46-
def _wrap_i8_function(f):
47-
@staticmethod
48-
def wrapper(*args, **kwargs):
49-
view_args = [_as_i8(arg) for arg in args]
50-
return f(*view_args, **kwargs)
51-
return wrapper
52-
53-
def _wrap_dt_function(f):
54-
@staticmethod
55-
def wrapper(*args, **kwargs):
56-
view_args = [_dt_box_array(_as_i8(arg)) for arg in args]
57-
return f(*view_args, **kwargs)
58-
return wrapper
5940

6041
def _join_i8_wrapper(joinf, with_indexers=True):
6142
@staticmethod
@@ -72,6 +53,7 @@ def wrapper(left, right):
7253
return results
7354
return wrapper
7455

56+
7557
def _dt_index_cmp(opname):
7658
"""
7759
Wrap comparison operations to convert datetime-like to datetime64
@@ -87,32 +69,14 @@ def wrapper(self, other):
8769
other = _ensure_datetime64(other)
8870
result = func(other)
8971

90-
try:
91-
return result.view(np.ndarray)
92-
except:
93-
return result
72+
return result.view(np.ndarray)
73+
9474
return wrapper
9575

9676
def _ensure_datetime64(other):
9777
if isinstance(other, np.datetime64):
9878
return other
99-
elif com.is_integer(other):
100-
return np.int64(other).view('M8[us]')
101-
else:
102-
raise TypeError(other)
103-
104-
def _dt_index_op(opname):
105-
"""
106-
Wrap arithmetic operations to convert timedelta to a timedelta64.
107-
"""
108-
def wrapper(self, other):
109-
if isinstance(other, timedelta):
110-
func = getattr(self, opname)
111-
return func(np.timedelta64(other))
112-
else:
113-
func = getattr(super(DatetimeIndex, self), opname)
114-
return func(other)
115-
return wrapper
79+
raise TypeError('%s type object %s' % (type(other), str(other)))
11680

11781

11882
class TimeSeriesError(Exception):
@@ -154,8 +118,7 @@ class DatetimeIndex(Int64Index):
154118
_left_indexer = _join_i8_wrapper(_algos.left_join_indexer_int64)
155119
_left_indexer_unique = _join_i8_wrapper(
156120
_algos.left_join_indexer_unique_int64, with_indexers=False)
157-
158-
_arrmap = _wrap_dt_function(_algos.arrmap_object)
121+
_arrmap = None
159122

160123
__eq__ = _dt_index_cmp('__eq__')
161124
__ne__ = _dt_index_cmp('__ne__')
@@ -194,11 +157,6 @@ def __new__(cls, data=None,
194157
warnings.warn("parameter 'offset' is deprecated, "
195158
"please use 'freq' instead",
196159
FutureWarning)
197-
if isinstance(freq, basestring):
198-
freq = to_offset(freq)
199-
else:
200-
if isinstance(freq, basestring):
201-
freq = to_offset(freq)
202160

203161
offset = freq
204162

@@ -223,9 +181,6 @@ def __new__(cls, data=None,
223181
'collection of some kind, %s was passed'
224182
% repr(data))
225183

226-
if isinstance(data, datetime):
227-
data = [data]
228-
229184
# other iterable of some kind
230185
if not isinstance(data, (list, tuple)):
231186
data = list(data)
@@ -244,17 +199,16 @@ def __new__(cls, data=None,
244199
elif issubclass(data.dtype.type, np.datetime64):
245200
if isinstance(data, DatetimeIndex):
246201
subarr = data.values
247-
offset = data.offset
248-
verify_integrity = False
202+
if offset is None:
203+
offset = data.offset
204+
verify_integrity = False
249205
else:
250206
if data.dtype != _NS_DTYPE:
251207
subarr = lib.cast_to_nanoseconds(data)
252208
else:
253209
subarr = data
254210
elif data.dtype == _INT64_DTYPE:
255-
subarr = data.view(_NS_DTYPE)
256-
elif issubclass(data.dtype.type, np.integer):
257-
subarr = np.array(data, dtype=_NS_DTYPE, copy=copy)
211+
subarr = np.asarray(data, dtype=_NS_DTYPE)
258212
else:
259213
subarr = tools.to_datetime(data)
260214
if not np.issubdtype(subarr.dtype, np.datetime64):
@@ -295,10 +249,6 @@ def _generate(cls, start, end, periods, name, offset,
295249

296250
if start is not None:
297251
start = Timestamp(start)
298-
if not isinstance(start, Timestamp):
299-
raise ValueError('Failed to convert %s to timestamp'
300-
% start)
301-
302252
if normalize:
303253
start = normalize_date(start)
304254
_normalized = True
@@ -307,9 +257,6 @@ def _generate(cls, start, end, periods, name, offset,
307257

308258
if end is not None:
309259
end = Timestamp(end)
310-
if not isinstance(end, Timestamp):
311-
raise ValueError('Failed to convert %s to timestamp'
312-
% end)
313260

314261
if normalize:
315262
end = normalize_date(end)
@@ -319,6 +266,9 @@ def _generate(cls, start, end, periods, name, offset,
319266

320267
start, end, tz = tools._figure_out_timezone(start, end, tz)
321268

269+
if com._count_not_none(start, end, periods) < 2:
270+
raise ValueError('Must specify two of start, end, or periods')
271+
322272
if (offset._should_cache() and
323273
not (offset._normalize_cache and not _normalized) and
324274
_naive_in_cache_range(start, end)):
@@ -329,7 +279,7 @@ def _generate(cls, start, end, periods, name, offset,
329279

330280
if tz is not None:
331281
# Convert local to UTC
332-
ints = index.view('i8')
282+
ints = index.view('i8', type=np.ndarray)
333283
index = lib.tz_localize_to_utc(ints, tz)
334284
index = index.view(_NS_DTYPE)
335285

@@ -384,11 +334,6 @@ def _cached_range(cls, start=None, end=None, periods=None, offset=None,
384334
cachedRange = drc[offset]
385335

386336
if start is None:
387-
if end is None:
388-
raise Exception('Must provide start or end date!')
389-
if periods is None:
390-
raise Exception('Must provide number of periods!')
391-
392337
assert(isinstance(end, Timestamp))
393338

394339
end = offset.rollback(end)
@@ -400,9 +345,6 @@ def _cached_range(cls, start=None, end=None, periods=None, offset=None,
400345
start = offset.rollforward(start)
401346

402347
startLoc = cachedRange.get_loc(start)
403-
if periods is None:
404-
raise Exception('Must provide number of periods!')
405-
406348
endLoc = startLoc + periods
407349
else:
408350
if not offset.onOffset(start):
@@ -1050,7 +992,7 @@ def map(self, f):
1050992
try:
1051993
return f(self)
1052994
except:
1053-
return Index.map(self, f)
995+
return _algos.arrmap_object(self.asobject, f)
1054996

1055997
# alias to offset
1056998
@property
@@ -1330,9 +1272,6 @@ def indexer_between_time(self, start_time, end_time, include_start=True,
13301272
return mask.nonzero()[0]
13311273

13321274
def _generate_regular_range(start, end, periods, offset):
1333-
if com._count_not_none(start, end, periods) < 2:
1334-
raise ValueError('Must specify two of start, end, or periods')
1335-
13361275
if isinstance(offset, Tick):
13371276
stride = offset.nanos
13381277
if periods is None:
@@ -1461,9 +1400,9 @@ def parser(x):
14611400
result = parse_time_string(x, offset)
14621401
return result[0]
14631402

1464-
p_ufunc = np.frompyfunc(parser, 1, 1)
1465-
data = p_ufunc(arr)
1466-
return np.array(data, dtype=_NS_DTYPE)
1403+
arr = np.asarray(arr, dtype=object)
1404+
data = _algos.arrmap_object(arr, parser)
1405+
return tools.to_datetime(data)
14671406

14681407

14691408
_CACHE_START = Timestamp(datetime(1950, 1, 1))
@@ -1481,9 +1420,6 @@ def _naive_in_cache_range(start, end):
14811420
def _in_range(start, end, rng_start, rng_end):
14821421
return start > rng_start and end < rng_end
14831422

1484-
def _time_to_nanosecond(time):
1485-
return _time_to_micros(time) * 1000
1486-
14871423
def _time_to_micros(time):
14881424
seconds = time.hour * 60 * 60 + 60 * time.minute + time.second
14891425
return 1000000 * seconds + time.microsecond

pandas/tseries/offsets.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ def freqstr(self):
228228
return code
229229

230230

231-
class BusinessDay(DateOffset, CacheableOffset):
231+
class BusinessDay(CacheableOffset, DateOffset):
232232
"""
233233
DateOffset subclass representing possibly n business days
234234
"""
@@ -348,7 +348,7 @@ def rule_code(self):
348348
return 'MS'
349349

350350

351-
class BusinessMonthEnd(DateOffset, CacheableOffset):
351+
class BusinessMonthEnd(CacheableOffset, DateOffset):
352352
"""DateOffset increments between business EOM dates"""
353353

354354
def isAnchored(self):

pandas/tseries/tests/test_timeseries.py

+77
Original file line numberDiff line numberDiff line change
@@ -951,6 +951,74 @@ def _simple_ts(start, end, freq='D'):
951951
return Series(np.random.randn(len(rng)), index=rng)
952952

953953

954+
class TestDatetimeIndex(unittest.TestCase):
955+
956+
def test_append_nondatetimeindex(self):
957+
rng = date_range('1/1/2000', periods=10)
958+
idx = Index(['a', 'b', 'c', 'd'])
959+
960+
result = rng.append(idx)
961+
self.assert_(isinstance(result[0], Timestamp))
962+
963+
def test_constructor_coverage(self):
964+
rng = date_range('1/1/2000', periods=10.5)
965+
exp = date_range('1/1/2000', periods=10)
966+
self.assert_(rng.equals(exp))
967+
968+
self.assertRaises(ValueError, DatetimeIndex, start='1/1/2000',
969+
periods='foo', freq='D')
970+
971+
self.assertRaises(ValueError, DatetimeIndex, start='1/1/2000',
972+
end='1/10/2000')
973+
974+
self.assertRaises(ValueError, DatetimeIndex, '1/1/2000')
975+
976+
# generator expression
977+
gen = (datetime(2000, 1, 1) + timedelta(i) for i in range(10))
978+
result = DatetimeIndex(gen)
979+
expected = DatetimeIndex([datetime(2000, 1, 1) + timedelta(i)
980+
for i in range(10)])
981+
self.assert_(result.equals(expected))
982+
983+
# NumPy string array
984+
strings = np.array(['2000-01-01', '2000-01-02', '2000-01-03'])
985+
result = DatetimeIndex(strings)
986+
expected = DatetimeIndex(strings.astype('O'))
987+
self.assert_(result.equals(expected))
988+
989+
from_ints = DatetimeIndex(expected.asi8)
990+
self.assert_(from_ints.equals(expected))
991+
992+
# non-conforming
993+
self.assertRaises(ValueError, DatetimeIndex,
994+
['2000-01-01', '2000-01-02', '2000-01-04'],
995+
freq='D')
996+
997+
self.assertRaises(ValueError, DatetimeIndex,
998+
start='2011-01-01', freq='b')
999+
self.assertRaises(ValueError, DatetimeIndex,
1000+
end='2011-01-01', freq='B')
1001+
self.assertRaises(ValueError, DatetimeIndex, periods=10, freq='D')
1002+
1003+
def test_comparisons_coverage(self):
1004+
rng = date_range('1/1/2000', periods=10)
1005+
1006+
# raise TypeError for now
1007+
self.assertRaises(TypeError, rng.__lt__, rng[3].value)
1008+
1009+
result = rng == list(rng)
1010+
exp = rng == rng
1011+
self.assert_(np.array_equal(result, exp))
1012+
1013+
def test_map(self):
1014+
rng = date_range('1/1/2000', periods=10)
1015+
1016+
f = lambda x: x.strftime('%Y%m%d')
1017+
result = rng.map(f)
1018+
exp = [f(x) for x in rng]
1019+
self.assert_(np.array_equal(result, exp))
1020+
1021+
9541022
class TestLegacySupport(unittest.TestCase):
9551023

9561024
@classmethod
@@ -968,6 +1036,15 @@ def setUpClass(cls):
9681036
with open(filepath, 'rb') as f:
9691037
cls.series = pickle.load(f)
9701038

1039+
def test_pass_offset_warn(self):
1040+
from StringIO import StringIO
1041+
import sys
1042+
buf = StringIO()
1043+
1044+
sys.stderr = buf
1045+
DatetimeIndex(start='1/1/2000', periods=10, offset='H')
1046+
sys.stderr = sys.__stderr__
1047+
9711048
def test_unpickle_legacy_frame(self):
9721049
dtindex = DatetimeIndex(start='1/3/2005', end='1/14/2005',
9731050
freq=BDay(1))

test.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
coverage erase
33
# nosetests pandas/tests/test_index.py --with-coverage --cover-package=pandas.core --pdb-failure --pdb
44
#nosetests -w pandas --with-coverage --cover-package=pandas --pdb-failure --pdb #--cover-inclusive
5-
nosetests -w pandas --with-coverage --cover-package=pandas $* #--cover-inclusive
5+
nosetests -A "not slow" -w pandas/tseries --with-coverage --cover-package=pandas.tseries $* #--cover-inclusive
66
# nosetests -w pandas/io --with-coverage --cover-package=pandas.io --pdb-failure --pdb
77
# nosetests -w pandas/core --with-coverage --cover-package=pandas.core --pdb-failure --pdb
88
# nosetests -w pandas/stats --with-coverage --cover-package=pandas.stats

0 commit comments

Comments
 (0)