@@ -387,54 +387,19 @@ def __init__(self, left, right, name, na_op):
387
387
self .lvalues , self .rvalues = self ._convert_for_datetime (lvalues ,
388
388
rvalues )
389
389
390
- def _validate (self , lvalues , rvalues , name ):
391
- # timedelta and integer mul/div
392
-
393
- if ((self .is_timedelta_lhs and
394
- (self .is_integer_rhs or self .is_floating_rhs )) or
395
- (self .is_timedelta_rhs and
396
- (self .is_integer_lhs or self .is_floating_lhs ))):
397
-
398
- if name not in ('__div__' , '__truediv__' , '__mul__' , '__rmul__' ):
399
- raise TypeError ("can only operate on a timedelta and an "
400
- "integer or a float for division and "
401
- "multiplication, but the operator [{name}] "
402
- "was passed" .format (name = name ))
403
-
404
- # 2 timedeltas
405
- elif ((self .is_timedelta_lhs and
406
- (self .is_timedelta_rhs or self .is_offset_rhs )) or
407
- (self .is_timedelta_rhs and
408
- (self .is_timedelta_lhs or self .is_offset_lhs ))):
409
-
410
- if name not in ('__div__' , '__rdiv__' , '__truediv__' ,
411
- '__rtruediv__' , '__add__' , '__radd__' , '__sub__' ,
412
- '__rsub__' ):
413
- raise TypeError ("can only operate on a timedeltas for addition"
414
- ", subtraction, and division, but the operator"
415
- " [{name}] was passed" .format (name = name ))
416
-
417
- # datetime and timedelta/DateOffset
418
- elif (self .is_datetime_lhs and
419
- (self .is_timedelta_rhs or self .is_offset_rhs )):
390
+ def _validate_datetime (self , lvalues , rvalues , name ):
391
+ # assumes self.is_datetime_lhs
420
392
393
+ if (self .is_timedelta_rhs or self .is_offset_rhs ):
394
+ # datetime and timedelta/DateOffset
421
395
if name not in ('__add__' , '__radd__' , '__sub__' ):
422
396
raise TypeError ("can only operate on a datetime with a rhs of "
423
397
"a timedelta/DateOffset for addition and "
424
398
"subtraction, but the operator [{name}] was "
425
399
"passed" .format (name = name ))
426
400
427
- elif (self .is_datetime_rhs and
428
- (self .is_timedelta_lhs or self .is_offset_lhs )):
429
- if name not in ('__add__' , '__radd__' , '__rsub__' ):
430
- raise TypeError ("can only operate on a timedelta/DateOffset "
431
- "with a rhs of a datetime for addition, "
432
- "but the operator [{name}] was passed"
433
- .format (name = name ))
434
-
435
- # 2 datetimes
436
- elif self .is_datetime_lhs and self .is_datetime_rhs :
437
-
401
+ elif self .is_datetime_rhs :
402
+ # 2 datetimes
438
403
if name not in ('__sub__' , '__rsub__' ):
439
404
raise TypeError ("can only operate on a datetimes for"
440
405
" subtraction, but the operator [{name}] was"
@@ -445,18 +410,82 @@ def _validate(self, lvalues, rvalues, name):
445
410
raise ValueError ("Incompatible tz's on datetime subtraction "
446
411
"ops" )
447
412
448
- elif ((self .is_timedelta_lhs or self .is_offset_lhs ) and
449
- self .is_datetime_rhs ):
413
+ else :
414
+ raise TypeError ('cannot operate on a series without a rhs '
415
+ 'of a series/ndarray of type datetime64[ns] '
416
+ 'or a timedelta' )
417
+
418
+ def _validate_timedelta (self , name ):
419
+ # assumes self.is_timedelta_lhs
420
+
421
+ if self .is_integer_rhs or self .is_floating_rhs :
422
+ # timedelta and integer mul/div
423
+ self ._check_timedelta_with_numeric (name )
424
+ elif self .is_timedelta_rhs or self .is_offset_rhs :
425
+ # 2 timedeltas
426
+ if name not in ('__div__' , '__rdiv__' , '__truediv__' ,
427
+ '__rtruediv__' , '__add__' , '__radd__' , '__sub__' ,
428
+ '__rsub__' ):
429
+ raise TypeError ("can only operate on a timedeltas for addition"
430
+ ", subtraction, and division, but the operator"
431
+ " [{name}] was passed" .format (name = name ))
432
+ elif self .is_datetime_rhs :
433
+ if name not in ('__add__' , '__radd__' , '__rsub__' ):
434
+ raise TypeError ("can only operate on a timedelta/DateOffset "
435
+ "with a rhs of a datetime for addition, "
436
+ "but the operator [{name}] was passed"
437
+ .format (name = name ))
438
+ else :
439
+ raise TypeError ('cannot operate on a series without a rhs '
440
+ 'of a series/ndarray of type datetime64[ns] '
441
+ 'or a timedelta' )
442
+
443
+ def _validate_offset (self , name ):
444
+ # assumes self.is_offset_lhs
445
+
446
+ if self .is_timedelta_rhs :
447
+ # 2 timedeltas
448
+ if name not in ('__div__' , '__rdiv__' , '__truediv__' ,
449
+ '__rtruediv__' , '__add__' , '__radd__' , '__sub__' ,
450
+ '__rsub__' ):
451
+ raise TypeError ("can only operate on a timedeltas for addition"
452
+ ", subtraction, and division, but the operator"
453
+ " [{name}] was passed" .format (name = name ))
450
454
455
+ elif self .is_datetime_rhs :
451
456
if name not in ('__add__' , '__radd__' ):
452
457
raise TypeError ("can only operate on a timedelta/DateOffset "
453
458
"and a datetime for addition, but the operator"
454
459
" [{name}] was passed" .format (name = name ))
460
+
455
461
else :
456
462
raise TypeError ('cannot operate on a series without a rhs '
457
463
'of a series/ndarray of type datetime64[ns] '
458
464
'or a timedelta' )
459
465
466
+ def _validate (self , lvalues , rvalues , name ):
467
+ if self .is_datetime_lhs :
468
+ return self ._validate_datetime (lvalues , rvalues , name )
469
+ elif self .is_timedelta_lhs :
470
+ return self ._validate_timedelta (name )
471
+ elif self .is_offset_lhs :
472
+ return self ._validate_offset (name )
473
+
474
+ if ((self .is_integer_lhs or self .is_floating_lhs ) and
475
+ self .is_timedelta_rhs ):
476
+ self ._check_timedelta_with_numeric (name )
477
+ else :
478
+ raise TypeError ('cannot operate on a series without a rhs '
479
+ 'of a series/ndarray of type datetime64[ns] '
480
+ 'or a timedelta' )
481
+
482
+ def _check_timedelta_with_numeric (self , name ):
483
+ if name not in ('__div__' , '__truediv__' , '__mul__' , '__rmul__' ):
484
+ raise TypeError ("can only operate on a timedelta and an "
485
+ "integer or a float for division and "
486
+ "multiplication, but the operator [{name}] "
487
+ "was passed" .format (name = name ))
488
+
460
489
def _convert_to_array (self , values , name = None , other = None ):
461
490
"""converts values to ndarray"""
462
491
from pandas .core .tools .timedeltas import to_timedelta
0 commit comments