@@ -329,7 +329,7 @@ def get_start_end_field(
329329
330330@ cython.wraparound (False )
331331@ 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 ):
333333 """
334334 Given a int64-based datetime index, extract the year, month, etc.,
335335 field and return an array of these values.
@@ -348,7 +348,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
348348 out[i] = - 1
349349 continue
350350
351- dt64_to_dtstruct (dtindex[i], & dts)
351+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
352352 out[i] = dts.year
353353 return out
354354
@@ -359,7 +359,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
359359 out[i] = - 1
360360 continue
361361
362- dt64_to_dtstruct (dtindex[i], & dts)
362+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
363363 out[i] = dts.month
364364 return out
365365
@@ -370,7 +370,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
370370 out[i] = - 1
371371 continue
372372
373- dt64_to_dtstruct (dtindex[i], & dts)
373+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
374374 out[i] = dts.day
375375 return out
376376
@@ -381,8 +381,9 @@ def get_date_field(const int64_t[:] dtindex, str field):
381381 out[i] = - 1
382382 continue
383383
384- dt64_to_dtstruct (dtindex[i], & dts)
384+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
385385 out[i] = dts.hour
386+ # TODO: can we de-dup with period.pyx <accessor>s?
386387 return out
387388
388389 elif field == ' m' :
@@ -392,7 +393,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
392393 out[i] = - 1
393394 continue
394395
395- dt64_to_dtstruct (dtindex[i], & dts)
396+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
396397 out[i] = dts.min
397398 return out
398399
@@ -403,7 +404,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
403404 out[i] = - 1
404405 continue
405406
406- dt64_to_dtstruct (dtindex[i], & dts)
407+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
407408 out[i] = dts.sec
408409 return out
409410
@@ -414,7 +415,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
414415 out[i] = - 1
415416 continue
416417
417- dt64_to_dtstruct (dtindex[i], & dts)
418+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
418419 out[i] = dts.us
419420 return out
420421
@@ -425,7 +426,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
425426 out[i] = - 1
426427 continue
427428
428- dt64_to_dtstruct (dtindex[i], & dts)
429+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
429430 out[i] = dts.ps // 1000
430431 return out
431432 elif field == ' doy' :
@@ -435,7 +436,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
435436 out[i] = - 1
436437 continue
437438
438- dt64_to_dtstruct (dtindex[i], & dts)
439+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
439440 out[i] = get_day_of_year(dts.year, dts.month, dts.day)
440441 return out
441442
@@ -446,7 +447,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
446447 out[i] = - 1
447448 continue
448449
449- dt64_to_dtstruct (dtindex[i], & dts)
450+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
450451 out[i] = dayofweek(dts.year, dts.month, dts.day)
451452 return out
452453
@@ -457,7 +458,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
457458 out[i] = - 1
458459 continue
459460
460- dt64_to_dtstruct (dtindex[i], & dts)
461+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
461462 out[i] = get_week_of_year(dts.year, dts.month, dts.day)
462463 return out
463464
@@ -468,7 +469,7 @@ def get_date_field(const int64_t[:] dtindex, str field):
468469 out[i] = - 1
469470 continue
470471
471- dt64_to_dtstruct (dtindex[i], & dts)
472+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
472473 out[i] = dts.month
473474 out[i] = ((out[i] - 1 ) // 3 ) + 1
474475 return out
@@ -480,11 +481,11 @@ def get_date_field(const int64_t[:] dtindex, str field):
480481 out[i] = - 1
481482 continue
482483
483- dt64_to_dtstruct (dtindex[i], & dts)
484+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
484485 out[i] = get_days_in_month(dts.year, dts.month)
485486 return out
486487 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 ))
488489
489490 raise ValueError (f" Field {field} not supported" )
490491
@@ -564,7 +565,7 @@ cpdef isleapyear_arr(ndarray years):
564565
565566@ cython.wraparound (False )
566567@ 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 ):
568569 """
569570 Given a int64-based datetime array, return the ISO 8601 year, week, and day
570571 as a structured array.
@@ -592,7 +593,7 @@ def build_isocalendar_sarray(const int64_t[:] dtindex):
592593 if dtindex[i] == NPY_NAT:
593594 ret_val = 0 , 0 , 0
594595 else :
595- dt64_to_dtstruct (dtindex[i], & dts)
596+ pandas_datetime_to_datetimestruct (dtindex[i], reso , & dts)
596597 ret_val = get_iso_calendar(dts.year, dts.month, dts.day)
597598
598599 iso_years[i] = ret_val[0 ]
0 commit comments