@@ -42,10 +42,10 @@ static int floordiv(int x, int divisor) {
42
42
static int monthToQuarter (int month ) { return ((month - 1 ) / 3 ) + 1 ; }
43
43
44
44
45
- /* Find the absdate (days elapsed since datetime(1 , 1, 1)
45
+ /* Find the unix_date (days elapsed since datetime(1970 , 1, 1)
46
46
* for the given year/month/day.
47
47
* Assumes GREGORIAN_CALENDAR */
48
- npy_int64 absdate_from_ymd (int year , int month , int day ) {
48
+ npy_int64 unix_date_from_ymd (int year , int month , int day ) {
49
49
/* Calculate the absolute date */
50
50
pandas_datetimestruct dts ;
51
51
npy_int64 unix_date ;
@@ -55,16 +55,16 @@ npy_int64 absdate_from_ymd(int year, int month, int day) {
55
55
dts .month = month ;
56
56
dts .day = day ;
57
57
unix_date = pandas_datetimestruct_to_datetime (PANDAS_FR_D , & dts );
58
- return ORD_OFFSET + unix_date ;
58
+ return unix_date ;
59
59
}
60
60
61
61
/* Sets the date part of the date_info struct
62
62
Assumes GREGORIAN_CALENDAR */
63
63
static int dInfoCalc_SetFromAbsDate (register struct date_info * dinfo ,
64
- npy_int64 absdate ) {
64
+ npy_int64 unix_date ) {
65
65
pandas_datetimestruct dts ;
66
66
67
- pandas_datetime_to_datetimestruct (absdate - ORD_OFFSET , PANDAS_FR_D , & dts );
67
+ pandas_datetime_to_datetimestruct (unix_date , PANDAS_FR_D , & dts );
68
68
dinfo -> year = dts .year ;
69
69
dinfo -> month = dts .month ;
70
70
dinfo -> day = dts .day ;
@@ -137,26 +137,26 @@ PANDAS_INLINE npy_int64 transform_via_day(npy_int64 ordinal,
137
137
return result ;
138
138
}
139
139
140
- static npy_int64 DtoB_weekday (npy_int64 absdate ) {
141
- return floordiv (absdate , 7 ) * 5 + mod_compat (absdate , 7 ) - BDAY_OFFSET ;
140
+ static npy_int64 DtoB_weekday (npy_int64 unix_date ) {
141
+ return floordiv (unix_date + 4 , 7 ) * 5 + mod_compat (unix_date + 4 , 7 ) - 4 ;
142
142
}
143
143
144
144
static npy_int64 DtoB (struct date_info * dinfo ,
145
- int roll_back , npy_int64 absdate ) {
145
+ int roll_back , npy_int64 unix_date ) {
146
146
int day_of_week = dayofweek (dinfo -> year , dinfo -> month , dinfo -> day );
147
147
148
148
if (roll_back == 1 ) {
149
149
if (day_of_week > 4 ) {
150
150
// change to friday before weekend
151
- absdate -= (day_of_week - 4 );
151
+ unix_date -= (day_of_week - 4 );
152
152
}
153
153
} else {
154
154
if (day_of_week > 4 ) {
155
155
// change to Monday after weekend
156
- absdate += (7 - day_of_week );
156
+ unix_date += (7 - day_of_week );
157
157
}
158
158
}
159
- return DtoB_weekday (absdate );
159
+ return DtoB_weekday (unix_date );
160
160
}
161
161
162
162
@@ -165,18 +165,19 @@ static npy_int64 DtoB(struct date_info *dinfo,
165
165
static npy_int64 asfreq_DTtoA (npy_int64 ordinal , asfreq_info * af_info ) {
166
166
struct date_info dinfo ;
167
167
ordinal = downsample_daytime (ordinal , af_info );
168
- dInfoCalc_SetFromAbsDate (& dinfo , ordinal + ORD_OFFSET );
168
+ dInfoCalc_SetFromAbsDate (& dinfo , ordinal );
169
169
if (dinfo .month > af_info -> to_a_year_end ) {
170
- return (npy_int64 )(dinfo .year + 1 - BASE_YEAR );
170
+ return (npy_int64 )(dinfo .year + 1 - 1970 );
171
171
} else {
172
- return (npy_int64 )(dinfo .year - BASE_YEAR );
172
+ return (npy_int64 )(dinfo .year - 1970 );
173
173
}
174
174
}
175
175
176
- static npy_int64 DtoQ_yq (npy_int64 ordinal , asfreq_info * af_info , int * year ,
177
- int * quarter ) {
176
+ static int DtoQ_yq (npy_int64 ordinal , asfreq_info * af_info , int * year ) {
178
177
struct date_info dinfo ;
179
- dInfoCalc_SetFromAbsDate (& dinfo , ordinal + ORD_OFFSET );
178
+ int quarter ;
179
+
180
+ dInfoCalc_SetFromAbsDate (& dinfo , ordinal );
180
181
if (af_info -> to_q_year_end != 12 ) {
181
182
dinfo .month -= af_info -> to_q_year_end ;
182
183
if (dinfo .month <= 0 ) {
@@ -187,47 +188,43 @@ static npy_int64 DtoQ_yq(npy_int64 ordinal, asfreq_info *af_info, int *year,
187
188
}
188
189
189
190
* year = dinfo .year ;
190
- * quarter = monthToQuarter (dinfo .month );
191
-
192
- return 0 ;
191
+ quarter = monthToQuarter (dinfo .month );
192
+ return quarter ;
193
193
}
194
194
195
195
static npy_int64 asfreq_DTtoQ (npy_int64 ordinal , asfreq_info * af_info ) {
196
196
int year , quarter ;
197
197
198
198
ordinal = downsample_daytime (ordinal , af_info );
199
199
200
- DtoQ_yq (ordinal , af_info , & year , & quarter );
201
- return (npy_int64 )((year - BASE_YEAR ) * 4 + quarter - 1 );
200
+ quarter = DtoQ_yq (ordinal , af_info , & year );
201
+ return (npy_int64 )((year - 1970 ) * 4 + quarter - 1 );
202
202
}
203
203
204
204
static npy_int64 asfreq_DTtoM (npy_int64 ordinal , asfreq_info * af_info ) {
205
205
struct date_info dinfo ;
206
206
207
207
ordinal = downsample_daytime (ordinal , af_info );
208
208
209
- dInfoCalc_SetFromAbsDate (& dinfo , ordinal + ORD_OFFSET );
210
- return (npy_int64 )((dinfo .year - BASE_YEAR ) * 12 + dinfo .month - 1 );
209
+ dInfoCalc_SetFromAbsDate (& dinfo , ordinal );
210
+ return (npy_int64 )((dinfo .year - 1970 ) * 12 + dinfo .month - 1 );
211
211
}
212
212
213
213
static npy_int64 asfreq_DTtoW (npy_int64 ordinal , asfreq_info * af_info ) {
214
214
ordinal = downsample_daytime (ordinal , af_info );
215
- return (ordinal + ORD_OFFSET - (1 + af_info -> to_week_end )) / 7 + 1 -
216
- WEEK_OFFSET ;
215
+ return floordiv (ordinal + 3 - af_info -> to_week_end , 7 ) + 1 ;
217
216
}
218
217
219
218
static npy_int64 asfreq_DTtoB (npy_int64 ordinal , asfreq_info * af_info ) {
220
219
struct date_info dinfo ;
221
- npy_int64 absdate ;
222
220
int roll_back ;
223
221
224
222
ordinal = downsample_daytime (ordinal , af_info );
225
- absdate = ordinal + ORD_OFFSET ;
226
- dInfoCalc_SetFromAbsDate (& dinfo , absdate );
223
+ dInfoCalc_SetFromAbsDate (& dinfo , ordinal );
227
224
228
225
// This usage defines roll_back the opposite way from the others
229
226
roll_back = 1 - af_info -> is_end ;
230
- return DtoB (& dinfo , roll_back , absdate );
227
+ return DtoB (& dinfo , roll_back , ordinal );
231
228
}
232
229
233
230
// all intra day calculations are now done within one function
@@ -243,10 +240,7 @@ static npy_int64 asfreq_UpsampleWithinDay(npy_int64 ordinal,
243
240
//************ FROM BUSINESS ***************
244
241
245
242
static npy_int64 asfreq_BtoDT (npy_int64 ordinal , asfreq_info * af_info ) {
246
- ordinal += BDAY_OFFSET ;
247
- ordinal =
248
- (floordiv (ordinal - 1 , 5 ) * 7 + mod_compat (ordinal - 1 , 5 ) + 1 -
249
- ORD_OFFSET );
243
+ ordinal = floordiv (ordinal + 3 , 5 ) * 7 + mod_compat (ordinal + 3 , 5 ) - 3 ;
250
244
251
245
return upsample_daytime (ordinal , af_info );
252
246
}
@@ -270,8 +264,7 @@ static npy_int64 asfreq_BtoW(npy_int64 ordinal, asfreq_info *af_info) {
270
264
//************ FROM WEEKLY ***************
271
265
272
266
static npy_int64 asfreq_WtoDT (npy_int64 ordinal , asfreq_info * af_info ) {
273
- ordinal = (ordinal + WEEK_OFFSET ) * 7 +
274
- af_info -> from_week_end - ORD_OFFSET +
267
+ ordinal = ordinal * 7 + af_info -> from_week_end - 4 +
275
268
(7 - 1 ) * (af_info -> is_end - 1 );
276
269
return upsample_daytime (ordinal , af_info );
277
270
}
@@ -294,30 +287,29 @@ static npy_int64 asfreq_WtoW(npy_int64 ordinal, asfreq_info *af_info) {
294
287
295
288
static npy_int64 asfreq_WtoB (npy_int64 ordinal , asfreq_info * af_info ) {
296
289
struct date_info dinfo ;
297
- npy_int64 absdate = asfreq_WtoDT (ordinal , af_info ) + ORD_OFFSET ;
290
+ npy_int64 unix_date = asfreq_WtoDT (ordinal , af_info );
298
291
int roll_back = af_info -> is_end ;
299
- dInfoCalc_SetFromAbsDate (& dinfo , absdate );
292
+ dInfoCalc_SetFromAbsDate (& dinfo , unix_date );
300
293
301
- return DtoB (& dinfo , roll_back , absdate );
294
+ return DtoB (& dinfo , roll_back , unix_date );
302
295
}
303
296
304
297
//************ FROM MONTHLY ***************
305
298
static void MtoD_ym (npy_int64 ordinal , int * y , int * m ) {
306
- * y = floordiv (ordinal , 12 ) + BASE_YEAR ;
299
+ * y = floordiv (ordinal , 12 ) + 1970 ;
307
300
* m = mod_compat (ordinal , 12 ) + 1 ;
308
301
}
309
302
310
303
static npy_int64 asfreq_MtoDT (npy_int64 ordinal , asfreq_info * af_info ) {
311
- npy_int64 absdate ;
304
+ npy_int64 unix_date ;
312
305
int y , m ;
313
306
314
307
ordinal += af_info -> is_end ;
315
308
MtoD_ym (ordinal , & y , & m );
316
- absdate = absdate_from_ymd (y , m , 1 );
317
- ordinal = absdate - ORD_OFFSET ;
309
+ unix_date = unix_date_from_ymd (y , m , 1 );
318
310
319
- ordinal -= af_info -> is_end ;
320
- return upsample_daytime (ordinal , af_info );
311
+ unix_date -= af_info -> is_end ;
312
+ return upsample_daytime (unix_date , af_info );
321
313
}
322
314
323
315
static npy_int64 asfreq_MtoA (npy_int64 ordinal , asfreq_info * af_info ) {
@@ -334,18 +326,18 @@ static npy_int64 asfreq_MtoW(npy_int64 ordinal, asfreq_info *af_info) {
334
326
335
327
static npy_int64 asfreq_MtoB (npy_int64 ordinal , asfreq_info * af_info ) {
336
328
struct date_info dinfo ;
337
- npy_int64 absdate = asfreq_MtoDT (ordinal , af_info ) + ORD_OFFSET ;
329
+ npy_int64 unix_date = asfreq_MtoDT (ordinal , af_info );
338
330
int roll_back = af_info -> is_end ;
339
331
340
- dInfoCalc_SetFromAbsDate (& dinfo , absdate );
332
+ dInfoCalc_SetFromAbsDate (& dinfo , unix_date );
341
333
342
- return DtoB (& dinfo , roll_back , absdate );
334
+ return DtoB (& dinfo , roll_back , unix_date );
343
335
}
344
336
345
337
//************ FROM QUARTERLY ***************
346
338
347
339
static void QtoD_ym (npy_int64 ordinal , int * y , int * m , asfreq_info * af_info ) {
348
- * y = floordiv (ordinal , 4 ) + BASE_YEAR ;
340
+ * y = floordiv (ordinal , 4 ) + 1970 ;
349
341
* m = mod_compat (ordinal , 4 ) * 3 + 1 ;
350
342
351
343
if (af_info -> from_q_year_end != 12 ) {
@@ -359,16 +351,16 @@ static void QtoD_ym(npy_int64 ordinal, int *y, int *m, asfreq_info *af_info) {
359
351
}
360
352
361
353
static npy_int64 asfreq_QtoDT (npy_int64 ordinal , asfreq_info * af_info ) {
362
- npy_int64 absdate ;
354
+ npy_int64 unix_date ;
363
355
int y , m ;
364
356
365
357
ordinal += af_info -> is_end ;
366
358
QtoD_ym (ordinal , & y , & m , af_info );
367
359
368
- absdate = absdate_from_ymd (y , m , 1 );
360
+ unix_date = unix_date_from_ymd (y , m , 1 );
369
361
370
- absdate -= af_info -> is_end ;
371
- return upsample_daytime (absdate - ORD_OFFSET , af_info );
362
+ unix_date -= af_info -> is_end ;
363
+ return upsample_daytime (unix_date , af_info );
372
364
}
373
365
374
366
static npy_int64 asfreq_QtoQ (npy_int64 ordinal , asfreq_info * af_info ) {
@@ -389,32 +381,32 @@ static npy_int64 asfreq_QtoW(npy_int64 ordinal, asfreq_info *af_info) {
389
381
390
382
static npy_int64 asfreq_QtoB (npy_int64 ordinal , asfreq_info * af_info ) {
391
383
struct date_info dinfo ;
392
- npy_int64 absdate = asfreq_QtoDT (ordinal , af_info ) + ORD_OFFSET ;
384
+ npy_int64 unix_date = asfreq_QtoDT (ordinal , af_info );
393
385
int roll_back = af_info -> is_end ;
394
386
395
- dInfoCalc_SetFromAbsDate (& dinfo , absdate );
387
+ dInfoCalc_SetFromAbsDate (& dinfo , unix_date );
396
388
397
- return DtoB (& dinfo , roll_back , absdate );
389
+ return DtoB (& dinfo , roll_back , unix_date );
398
390
}
399
391
400
392
//************ FROM ANNUAL ***************
401
393
402
394
static npy_int64 asfreq_AtoDT (npy_int64 ordinal , asfreq_info * af_info ) {
403
- npy_int64 absdate ;
395
+ npy_int64 unix_date ;
404
396
405
397
// start from 1970
406
- npy_int64 year = ordinal + BASE_YEAR ;
398
+ npy_int64 year = ordinal + 1970 ;
407
399
408
400
int month = (af_info -> from_a_year_end % 12 ) + 1 ;
409
401
if (af_info -> from_a_year_end != 12 ) {
410
402
year -= 1 ;
411
403
}
412
404
413
405
year += af_info -> is_end ;
414
- absdate = absdate_from_ymd (year , month , 1 );
406
+ unix_date = unix_date_from_ymd (year , month , 1 );
415
407
416
- absdate -= af_info -> is_end ;
417
- return upsample_daytime (absdate - ORD_OFFSET , af_info );
408
+ unix_date -= af_info -> is_end ;
409
+ return upsample_daytime (unix_date , af_info );
418
410
}
419
411
420
412
static npy_int64 asfreq_AtoA (npy_int64 ordinal , asfreq_info * af_info ) {
@@ -435,11 +427,11 @@ static npy_int64 asfreq_AtoW(npy_int64 ordinal, asfreq_info *af_info) {
435
427
436
428
static npy_int64 asfreq_AtoB (npy_int64 ordinal , asfreq_info * af_info ) {
437
429
struct date_info dinfo ;
438
- npy_int64 absdate = asfreq_AtoDT (ordinal , af_info ) + ORD_OFFSET ;
430
+ npy_int64 unix_date = asfreq_AtoDT (ordinal , af_info );
439
431
int roll_back = af_info -> is_end ;
440
- dInfoCalc_SetFromAbsDate (& dinfo , absdate );
432
+ dInfoCalc_SetFromAbsDate (& dinfo , unix_date );
441
433
442
- return DtoB (& dinfo , roll_back , absdate );
434
+ return DtoB (& dinfo , roll_back , unix_date );
443
435
}
444
436
445
437
static npy_int64 nofunc (npy_int64 ordinal , asfreq_info * af_info ) {
0 commit comments