@@ -329,7 +329,7 @@ def get_start_end_field(
329
329
330
330
@ cython.wraparound (False )
331
331
@ cython.boundscheck (False )
332
- def get_date_field (const int64_t[:] dtindex , str field ):
332
+ def get_date_field (const int64_t[:] dtindex , str field , NPY_DATETIMEUNIT reso = NPY_FR_ns ):
333
333
"""
334
334
Given a int64-based datetime index, extract the year, month, etc.,
335
335
field and return an array of these values.
@@ -348,7 +348,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
348
348
out[i] = - 1
349
349
continue
350
350
351
- dt64_to_dtstruct (dtindex[i], & dts)
351
+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
352
352
out[i] = dts.year
353
353
return out
354
354
@@ -359,7 +359,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
359
359
out[i] = - 1
360
360
continue
361
361
362
- dt64_to_dtstruct (dtindex[i], & dts)
362
+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
363
363
out[i] = dts.month
364
364
return out
365
365
@@ -370,7 +370,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
370
370
out[i] = - 1
371
371
continue
372
372
373
- dt64_to_dtstruct (dtindex[i], & dts)
373
+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
374
374
out[i] = dts.day
375
375
return out
376
376
@@ -381,8 +381,9 @@ def get_date_field(const int64_t[:] dtindex, str field):
381
381
out[i] = - 1
382
382
continue
383
383
384
- dt64_to_dtstruct (dtindex[i], & dts)
384
+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
385
385
out[i] = dts.hour
386
+ # TODO: can we de-dup with period.pyx <accessor>s?
386
387
return out
387
388
388
389
elif field == ' m' :
@@ -392,7 +393,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
392
393
out[i] = - 1
393
394
continue
394
395
395
- dt64_to_dtstruct (dtindex[i], & dts)
396
+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
396
397
out[i] = dts.min
397
398
return out
398
399
@@ -403,7 +404,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
403
404
out[i] = - 1
404
405
continue
405
406
406
- dt64_to_dtstruct (dtindex[i], & dts)
407
+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
407
408
out[i] = dts.sec
408
409
return out
409
410
@@ -414,7 +415,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
414
415
out[i] = - 1
415
416
continue
416
417
417
- dt64_to_dtstruct (dtindex[i], & dts)
418
+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
418
419
out[i] = dts.us
419
420
return out
420
421
@@ -425,7 +426,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
425
426
out[i] = - 1
426
427
continue
427
428
428
- dt64_to_dtstruct (dtindex[i], & dts)
429
+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
429
430
out[i] = dts.ps // 1000
430
431
return out
431
432
elif field == ' doy' :
@@ -435,7 +436,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
435
436
out[i] = - 1
436
437
continue
437
438
438
- dt64_to_dtstruct (dtindex[i], & dts)
439
+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
439
440
out[i] = get_day_of_year(dts.year, dts.month, dts.day)
440
441
return out
441
442
@@ -446,7 +447,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
446
447
out[i] = - 1
447
448
continue
448
449
449
- dt64_to_dtstruct (dtindex[i], & dts)
450
+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
450
451
out[i] = dayofweek(dts.year, dts.month, dts.day)
451
452
return out
452
453
@@ -457,7 +458,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
457
458
out[i] = - 1
458
459
continue
459
460
460
- dt64_to_dtstruct (dtindex[i], & dts)
461
+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
461
462
out[i] = get_week_of_year(dts.year, dts.month, dts.day)
462
463
return out
463
464
@@ -468,7 +469,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
468
469
out[i] = - 1
469
470
continue
470
471
471
- dt64_to_dtstruct (dtindex[i], & dts)
472
+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
472
473
out[i] = dts.month
473
474
out[i] = ((out[i] - 1 ) // 3 ) + 1
474
475
return out
@@ -480,11 +481,11 @@ def get_date_field(const int64_t[:] dtindex, str field):
480
481
out[i] = - 1
481
482
continue
482
483
483
- dt64_to_dtstruct (dtindex[i], & dts)
484
+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
484
485
out[i] = get_days_in_month(dts.year, dts.month)
485
486
return out
486
487
elif field == ' is_leap_year' :
487
- return isleapyear_arr(get_date_field(dtindex, ' Y' ))
488
+ return isleapyear_arr(get_date_field(dtindex, ' Y' , reso = reso ))
488
489
489
490
raise ValueError (f" Field {field} not supported" )
490
491
@@ -564,7 +565,7 @@ cpdef isleapyear_arr(ndarray years):
564
565
565
566
@ cython.wraparound (False )
566
567
@ cython.boundscheck (False )
567
- def build_isocalendar_sarray (const int64_t[:] dtindex ):
568
+ def build_isocalendar_sarray (const int64_t[:] dtindex , NPY_DATETIMEUNIT reso = NPY_FR_ns ):
568
569
"""
569
570
Given a int64-based datetime array, return the ISO 8601 year, week, and day
570
571
as a structured array.
@@ -592,7 +593,7 @@ def build_isocalendar_sarray(const int64_t[:] dtindex):
592
593
if dtindex[i] == NPY_NAT:
593
594
ret_val = 0 , 0 , 0
594
595
else :
595
- dt64_to_dtstruct (dtindex[i], & dts)
596
+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
596
597
ret_val = get_iso_calendar(dts.year, dts.month, dts.day)
597
598
598
599
iso_years[i] = ret_val[0 ]
0 commit comments