@@ -65,6 +65,7 @@ def ints_to_pydatetime(ndarray[int64_t] arr, tz=None):
65
65
return result
66
66
67
67
68
+
68
69
# Python front end to C extension type _Timestamp
69
70
# This serves as the box for datetime64
70
71
class Timestamp (_Timestamp ):
@@ -101,10 +102,27 @@ class Timestamp(_Timestamp):
101
102
return ts_base
102
103
103
104
def __repr__ (self ):
104
- result = self .strftime(' <Timestamp: %Y -%m -%d %H :%M :%S%z ' )
105
- if self .tzinfo:
106
- result += self .strftime(' %% Z, tz=%s ' % self .tzinfo.zone)
107
- return result + ' >'
105
+ result = ' %d -%.2d -%.2d %.2d :%.2d :%.2d ' % (self .year, self .month,
106
+ self .day, self .hour,
107
+ self .minute, self .second)
108
+
109
+ if self .nanosecond != 0 :
110
+ nanos = self .nanosecond + 1000 * self .microsecond
111
+ result += ' .%.9d ' % nanos
112
+ elif self .microsecond != 0 :
113
+ result += ' .%.6d ' % self .microsecond
114
+
115
+ try :
116
+ result += self .strftime(' %z ' )
117
+ if self .tzinfo:
118
+ result += self .strftime(' %% Z, tz=%s ' % self .tzinfo.zone)
119
+ except ValueError :
120
+ year2000 = self .replace(year = 2000 )
121
+ result += year2000.strftime(' %z ' )
122
+ if self .tzinfo:
123
+ result += year2000.strftime(' %% Z, tz=%s ' % self .tzinfo.zone)
124
+
125
+ return ' <Timestamp: %s >' % result
108
126
109
127
@property
110
128
def tz (self ):
@@ -507,13 +525,17 @@ cpdef convert_to_tsobject(object ts, object tz=None):
507
525
obj.tzinfo = ts.tzinfo
508
526
if obj.tzinfo is not None :
509
527
obj.value -= _delta_to_nanoseconds(obj.tzinfo._utcoffset)
528
+ _check_dts_bounds(obj.value, & obj.dts)
510
529
return obj
511
530
elif PyDate_Check(ts):
512
531
obj.value = _date_to_datetime64(ts, & obj.dts)
513
532
else :
514
533
raise ValueError (" Could not construct Timestamp from argument %s " %
515
534
type (ts))
516
535
536
+ if obj.value != NPY_NAT:
537
+ _check_dts_bounds(obj.value, & obj.dts)
538
+
517
539
if tz is not None :
518
540
if tz is pytz.utc:
519
541
obj.tzinfo = tz
@@ -530,6 +552,16 @@ cpdef convert_to_tsobject(object ts, object tz=None):
530
552
531
553
return obj
532
554
555
+ cdef int64_t _NS_LOWER_BOUND = - 9223285636854775809L L
556
+ cdef int64_t _NS_UPPER_BOUND = - 9223372036854775807L L
557
+
558
+ cdef inline _check_dts_bounds(int64_t value, pandas_datetimestruct * dts):
559
+ cdef pandas_datetimestruct dts2
560
+ if dts.year <= 1677 or dts.year >= 2262 :
561
+ pandas_datetime_to_datetimestruct(value, PANDAS_FR_ns, & dts2)
562
+ if dts2.year != dts.year:
563
+ raise ValueError (' Out of bounds timestamp in year: %s ' % dts.year)
564
+
533
565
# elif isinstance(ts, _Timestamp):
534
566
# tmp = ts
535
567
# obj.value = (<_Timestamp> ts).value
0 commit comments