Pandas .dt.round округляет ближайший час случайным образом? - PullRequest
1 голос
/ 06 мая 2020

У меня есть переменная с 3 отметками времени.

a = DatetimeIndex(['2016-01-26 20:30:00', '2016-01-26 21:30:00','2016-01-26 22:30:00'],
              dtype='datetime64[ns]', freq='H')

С тех пор я узнал, что функция round выполняет округление в соответствии с этими правилами, «когда на полпути между двумя целыми числами выбирается четное целое число. "

a.round('H')
DatetimeIndex(['2016-01-26 20:00:00', '2016-01-26 22:00:00','2016-01-26 22:00:00'],
              dtype='datetime64[ns]', freq=None)

Как я могу убедиться, что он округляет все 30-минутные отметки времени (например, 20:30, 19:30) до следующего часа.

Спасибо!

Edit:

Я пробовал следующую функцию из Pandas Timestamp округляет 30 секунд непоследовательно

def half_up_minute(x):
    m = (x - x.floor('H')).total_seconds() < 30   # Round True Down, False Up
    return x.where(m).floor('H').fillna(x.ceil('H'))

, но получаю следующую ошибку:

TypeError: 'value' must be a scalar, passed: DatetimeIndex

1 Ответ

1 голос
/ 06 мая 2020

Вы можете изменить функцию для замены fillna Series на второй аргумент в Index.where и сравнить по 30 Minutes:

def half_up_minute(x):
    m = (x - x.floor('H')).total_seconds() < 30 * 60   
    return x.floor('H').where(m, x.ceil('H'))

print (half_up_minute(a))
DatetimeIndex(['2016-01-26 21:00:00', '2016-01-26 22:00:00',
               '2016-01-26 23:00:00'],
              dtype='datetime64[ns]', freq=None)   

a = pd.date_range('2016-01-26 20:30:00', periods=20, freq='10T')
print (a)
DatetimeIndex(['2016-01-26 20:30:00', '2016-01-26 20:40:00',
               '2016-01-26 20:50:00', '2016-01-26 21:00:00',
               '2016-01-26 21:10:00', '2016-01-26 21:20:00',
               '2016-01-26 21:30:00', '2016-01-26 21:40:00',
               '2016-01-26 21:50:00', '2016-01-26 22:00:00',
               '2016-01-26 22:10:00', '2016-01-26 22:20:00',
               '2016-01-26 22:30:00', '2016-01-26 22:40:00',
               '2016-01-26 22:50:00', '2016-01-26 23:00:00',
               '2016-01-26 23:10:00', '2016-01-26 23:20:00',
               '2016-01-26 23:30:00', '2016-01-26 23:40:00'],
              dtype='datetime64[ns]', freq='10T')

def half_up_minute(x):
    m = (x - x.floor('H')).total_seconds() < 30 * 60   
    return x.floor('H').where(m, x.ceil('H'))

print (half_up_minute(a))
DatetimeIndex(['2016-01-26 21:00:00', '2016-01-26 21:00:00',
               '2016-01-26 21:00:00', '2016-01-26 21:00:00',
               '2016-01-26 21:00:00', '2016-01-26 21:00:00',
               '2016-01-26 22:00:00', '2016-01-26 22:00:00',
               '2016-01-26 22:00:00', '2016-01-26 22:00:00',
               '2016-01-26 22:00:00', '2016-01-26 22:00:00',
               '2016-01-26 23:00:00', '2016-01-26 23:00:00',
               '2016-01-26 23:00:00', '2016-01-26 23:00:00',
               '2016-01-26 23:00:00', '2016-01-26 23:00:00',
               '2016-01-27 00:00:00', '2016-01-27 00:00:00'],
              dtype='datetime64[ns]', freq=None)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...