@@ -47,10 +47,9 @@ except NameError: # py3
47
47
# This serves as the box for datetime64
48
48
class Timestamp (_Timestamp ):
49
49
50
- __slots__ = [' value' , ' offset' ]
51
-
52
50
def __new__ (cls , object ts_input , object offset = None , tz = None ):
53
51
cdef _TSObject ts
52
+ cdef _Timestamp ts_base
54
53
55
54
if isinstance (ts_input, float ):
56
55
# to do, do we want to support this, ie with fractional seconds?
@@ -72,6 +71,7 @@ class Timestamp(_Timestamp):
72
71
# fill out rest of data
73
72
ts_base.value = ts.value
74
73
ts_base.offset = offset
74
+ ts_base.nanosecond = ts.dts.ps / 1000
75
75
76
76
return ts_base
77
77
@@ -185,7 +185,7 @@ def apply_offset(ndarray[object] values, object offset):
185
185
ndarray[int64_t] new_values
186
186
object boxed
187
187
188
- result = np.empty(n, dtype = ' M8[us ]' )
188
+ result = np.empty(n, dtype = ' M8[ns ]' )
189
189
new_values = result.view(' i8' )
190
190
pass
191
191
@@ -194,8 +194,8 @@ def apply_offset(ndarray[object] values, object offset):
194
194
# (see Timestamp class above). This will serve as a C extension type that
195
195
# shadows the python class, where we do any heavy lifting.
196
196
cdef class _Timestamp(datetime):
197
- cdef:
198
- int64_t value # numpy int64
197
+ cdef public :
198
+ int64_t value, nanosecond
199
199
object offset # frequency reference
200
200
201
201
def __add__ (self , other ):
@@ -250,13 +250,13 @@ cpdef convert_to_tsobject(object ts, object tz=None):
250
250
251
251
if is_datetime64_object(ts):
252
252
obj.value = unbox_datetime64_scalar(ts)
253
- pandas_datetime_to_datetimestruct(obj.value, PANDAS_FR_us , & obj.dts)
253
+ pandas_datetime_to_datetimestruct(obj.value, PANDAS_FR_ns , & obj.dts)
254
254
elif is_integer_object(ts):
255
255
obj.value = ts
256
- pandas_datetime_to_datetimestruct(ts, PANDAS_FR_us , & obj.dts)
256
+ pandas_datetime_to_datetimestruct(ts, PANDAS_FR_ns , & obj.dts)
257
257
elif util.is_string_object(ts):
258
258
_string_to_dts(ts, & obj.dts)
259
- obj.value = pandas_datetimestruct_to_datetime(PANDAS_FR_us , & obj.dts)
259
+ obj.value = pandas_datetimestruct_to_datetime(PANDAS_FR_ns , & obj.dts)
260
260
elif PyDateTime_Check(ts):
261
261
obj.value = _pydatetime_to_dts(ts, & obj.dts)
262
262
obj.tzinfo = ts.tzinfo
@@ -280,7 +280,7 @@ cpdef convert_to_tsobject(object ts, object tz=None):
280
280
obj.value = obj.value + deltas[pos]
281
281
282
282
if utc_convert:
283
- pandas_datetime_to_datetimestruct(obj.value, PANDAS_FR_us ,
283
+ pandas_datetime_to_datetimestruct(obj.value, PANDAS_FR_ns ,
284
284
& obj.dts)
285
285
obj.tzinfo = tz._tzinfos[inf]
286
286
@@ -297,7 +297,7 @@ cpdef convert_to_tsobject(object ts, object tz=None):
297
297
298
298
cdef inline object _datetime64_to_datetime(int64_t val):
299
299
cdef pandas_datetimestruct dts
300
- pandas_datetime_to_datetimestruct(val, PANDAS_FR_us , & dts)
300
+ pandas_datetime_to_datetimestruct(val, PANDAS_FR_ns , & dts)
301
301
return _dts_to_pydatetime(& dts)
302
302
303
303
cdef inline object _dts_to_pydatetime(pandas_datetimestruct * dts):
@@ -313,7 +313,7 @@ cdef inline int64_t _pydatetime_to_dts(object val, pandas_datetimestruct *dts):
313
313
dts.min = PyDateTime_DATE_GET_MINUTE(val)
314
314
dts.sec = PyDateTime_DATE_GET_SECOND(val)
315
315
dts.us = PyDateTime_DATE_GET_MICROSECOND(val)
316
- return pandas_datetimestruct_to_datetime(PANDAS_FR_us , dts)
316
+ return pandas_datetimestruct_to_datetime(PANDAS_FR_ns , dts)
317
317
318
318
cdef inline int64_t _dtlike_to_datetime64(object val,
319
319
pandas_datetimestruct * dts):
@@ -324,7 +324,7 @@ cdef inline int64_t _dtlike_to_datetime64(object val,
324
324
dts.min = val.minute
325
325
dts.sec = val.second
326
326
dts.us = val.microsecond
327
- return pandas_datetimestruct_to_datetime(PANDAS_FR_us , dts)
327
+ return pandas_datetimestruct_to_datetime(PANDAS_FR_ns , dts)
328
328
329
329
cdef inline int64_t _date_to_datetime64(object val,
330
330
pandas_datetimestruct * dts):
@@ -335,7 +335,7 @@ cdef inline int64_t _date_to_datetime64(object val,
335
335
dts.min = 0
336
336
dts.sec = 0
337
337
dts.us = 0
338
- return pandas_datetimestruct_to_datetime(PANDAS_FR_us , dts)
338
+ return pandas_datetimestruct_to_datetime(PANDAS_FR_ns , dts)
339
339
340
340
341
341
cdef inline int _string_to_dts(object val, pandas_datetimestruct* dts) except - 1 :
@@ -345,7 +345,7 @@ cdef inline int _string_to_dts(object val, pandas_datetimestruct* dts) except -1
345
345
346
346
if PyUnicode_Check(val):
347
347
val = PyUnicode_AsASCIIString(val);
348
- parse_iso_8601_datetime(val, len (val), PANDAS_FR_us , NPY_UNSAFE_CASTING,
348
+ parse_iso_8601_datetime(val, len (val), PANDAS_FR_ns , NPY_UNSAFE_CASTING,
349
349
dts, & islocal, & out_bestunit, & special)
350
350
return 0
351
351
@@ -738,7 +738,7 @@ def string_to_datetime(ndarray[object] strings, raise_=False, dayfirst=False):
738
738
from dateutil.parser import parse
739
739
740
740
try :
741
- result = np.empty(n, dtype = ' M8[us ]' )
741
+ result = np.empty(n, dtype = ' M8[ns ]' )
742
742
iresult = result.view(' i8' )
743
743
for i in range (n):
744
744
val = strings[i]
@@ -903,7 +903,7 @@ def _get_transitions(tz):
903
903
Get UTC times of DST transitions
904
904
"""
905
905
if tz not in trans_cache:
906
- arr = np.array(tz._utc_transition_times, dtype = ' M8[us ]' )
906
+ arr = np.array(tz._utc_transition_times, dtype = ' M8[ns ]' )
907
907
trans_cache[tz] = arr.view(' i8' )
908
908
return trans_cache[tz]
909
909
@@ -1009,7 +1009,7 @@ def build_field_sarray(ndarray[int64_t] dtindex):
1009
1009
mus = out[' u' ]
1010
1010
1011
1011
for i in range (count):
1012
- pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_us , & dts)
1012
+ pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_ns , & dts)
1013
1013
years[i] = dts.year
1014
1014
months[i] = dts.month
1015
1015
days[i] = dts.day
@@ -1044,49 +1044,49 @@ def fast_field_accessor(ndarray[int64_t] dtindex, object field):
1044
1044
1045
1045
if field == ' Y' :
1046
1046
for i in range (count):
1047
- pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_us , & dts)
1047
+ pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_ns , & dts)
1048
1048
out[i] = dts.year
1049
1049
return out
1050
1050
1051
1051
elif field == ' M' :
1052
1052
for i in range (count):
1053
- pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_us , & dts)
1053
+ pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_ns , & dts)
1054
1054
out[i] = dts.month
1055
1055
return out
1056
1056
1057
1057
elif field == ' D' :
1058
1058
for i in range (count):
1059
- pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_us , & dts)
1059
+ pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_ns , & dts)
1060
1060
out[i] = dts.day
1061
1061
return out
1062
1062
1063
1063
elif field == ' h' :
1064
1064
for i in range (count):
1065
- pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_us , & dts)
1065
+ pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_ns , & dts)
1066
1066
out[i] = dts.hour
1067
1067
return out
1068
1068
1069
1069
elif field == ' m' :
1070
1070
for i in range (count):
1071
- pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_us , & dts)
1071
+ pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_ns , & dts)
1072
1072
out[i] = dts.min
1073
1073
return out
1074
1074
1075
1075
elif field == ' s' :
1076
1076
for i in range (count):
1077
- pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_us , & dts)
1077
+ pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_ns , & dts)
1078
1078
out[i] = dts.sec
1079
1079
return out
1080
1080
1081
1081
elif field == ' us' :
1082
1082
for i in range (count):
1083
- pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_us , & dts)
1083
+ pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_ns , & dts)
1084
1084
out[i] = dts.us
1085
1085
return out
1086
1086
1087
1087
elif field == ' doy' :
1088
1088
for i in range (count):
1089
- pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_us , & dts)
1089
+ pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_ns , & dts)
1090
1090
isleap = is_leapyear(dts.year)
1091
1091
out[i] = _month_offset[isleap, dts.month- 1 ] + dts.day
1092
1092
return out
@@ -1099,15 +1099,15 @@ def fast_field_accessor(ndarray[int64_t] dtindex, object field):
1099
1099
1100
1100
elif field == ' woy' :
1101
1101
for i in range (count):
1102
- pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_us , & dts)
1102
+ pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_ns , & dts)
1103
1103
isleap = is_leapyear(dts.year)
1104
1104
out[i] = _month_offset[isleap, dts.month - 1 ] + dts.day
1105
1105
out[i] = ((out[i] - 1 ) / 7 ) + 1
1106
1106
return out
1107
1107
1108
1108
elif field == ' q' :
1109
1109
for i in range (count):
1110
- pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_us , & dts)
1110
+ pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_ns , & dts)
1111
1111
out[i] = dts.month
1112
1112
out[i] = ((out[i] - 1 ) / 3 ) + 1
1113
1113
return out
@@ -1119,7 +1119,7 @@ cdef inline int m8_weekday(int64_t val):
1119
1119
ts = convert_to_tsobject(val)
1120
1120
return ts_dayofweek(ts)
1121
1121
1122
- cdef int64_t DAY_US = 86400000000L L
1122
+ cdef int64_t DAY_NS = 86400000000000L L
1123
1123
1124
1124
def values_at_time (ndarray[int64_t] stamps , int64_t time ):
1125
1125
cdef:
@@ -1133,18 +1133,14 @@ def values_at_time(ndarray[int64_t] stamps, int64_t time):
1133
1133
return np.empty(0 , dtype = np.int64)
1134
1134
1135
1135
# is this OK?
1136
- # days = stamps // DAY_US
1137
- times = stamps % DAY_US
1136
+ # days = stamps // DAY_NS
1137
+ times = stamps % DAY_NS
1138
1138
1139
- # Microsecond resolution
1139
+ # Nanosecond resolution
1140
1140
count = 0
1141
1141
for i in range (1 , n):
1142
1142
if times[i] == time:
1143
1143
count += 1
1144
- # cur = days[i]
1145
- # if cur > last:
1146
- # count += 1
1147
- # last = cur
1148
1144
1149
1145
indexer = np.empty(count, dtype = np.int64)
1150
1146
@@ -1155,11 +1151,6 @@ def values_at_time(ndarray[int64_t] stamps, int64_t time):
1155
1151
indexer[j] = i
1156
1152
j += 1
1157
1153
1158
- # cur = days[i]
1159
- # if cur > last:
1160
- # j += 1
1161
- # last = cur
1162
-
1163
1154
return indexer
1164
1155
1165
1156
@@ -1170,12 +1161,12 @@ def date_normalize(ndarray[int64_t] stamps):
1170
1161
pandas_datetimestruct dts
1171
1162
1172
1163
for i in range (n):
1173
- pandas_datetime_to_datetimestruct(stamps[i], PANDAS_FR_us , & dts)
1164
+ pandas_datetime_to_datetimestruct(stamps[i], PANDAS_FR_ns , & dts)
1174
1165
dts.hour = 0
1175
1166
dts.min = 0
1176
1167
dts.sec = 0
1177
1168
dts.us = 0
1178
- result[i] = pandas_datetimestruct_to_datetime(PANDAS_FR_us , & dts)
1169
+ result[i] = pandas_datetimestruct_to_datetime(PANDAS_FR_ns , & dts)
1179
1170
1180
1171
return result
1181
1172
@@ -1185,7 +1176,7 @@ def dates_normalized(ndarray[int64_t] stamps):
1185
1176
pandas_datetimestruct dts
1186
1177
1187
1178
for i in range (n):
1188
- pandas_datetime_to_datetimestruct(stamps[i], PANDAS_FR_us , & dts)
1179
+ pandas_datetime_to_datetimestruct(stamps[i], PANDAS_FR_ns , & dts)
1189
1180
if (dts.hour + dts.min + dts.sec + dts.us) > 0 :
1190
1181
return False
1191
1182
@@ -1250,7 +1241,7 @@ def dt64arr_to_periodarr(ndarray[int64_t] dtarr, int freq):
1250
1241
out = np.empty(l, dtype = ' i8' )
1251
1242
1252
1243
for i in range (l):
1253
- pandas_datetime_to_datetimestruct(dtarr[i], PANDAS_FR_us , & dts)
1244
+ pandas_datetime_to_datetimestruct(dtarr[i], PANDAS_FR_ns , & dts)
1254
1245
out[i] = get_period_ordinal(dts.year, dts.month, dts.day,
1255
1246
dts.hour, dts.min, dts.sec, freq)
1256
1247
return out
@@ -1349,7 +1340,7 @@ cpdef int64_t period_ordinal_to_dt64(int64_t ordinal, int freq):
1349
1340
dts.sec = int (dinfo.second)
1350
1341
dts.us = 0
1351
1342
1352
- return pandas_datetimestruct_to_datetime(PANDAS_FR_us , & dts)
1343
+ return pandas_datetimestruct_to_datetime(PANDAS_FR_ns , & dts)
1353
1344
1354
1345
def period_ordinal_to_string (int64_t value , int freq ):
1355
1346
cdef:
0 commit comments