Как установить базу для работы пола datetime в pandas? - PullRequest
1 голос
/ 09 июля 2020

Я хочу переназначить временные метки ряда дат так, чтобы они выходили за пол с частотой (например) 3 дня:

import pandas as pd

x = pd.date_range('01-01-2019', freq='1D', periods=7).floor('3D')
y = pd.date_range('01-01-2022', freq='1D', periods=7).floor('3D')

Я ожидаю, что «пол» выровняется с первым date и произвести:

In[3]: x
Out[3]: 
DatetimeIndex(['2019-01-01', '2019-01-01', '2019-01-01', '2019-01-04',
               '2019-01-04', '2019-01-04', '2019-01-07'],
              dtype='datetime64[ns]', freq=None)

In[4]: y
Out[4]:
DatetimeIndex(['2022-01-01', '2022-01-01', '2022-01-01', '2022-01-04',
               '2022-01-04', '2022-01-04', '2022-01-07'],
              dtype='datetime64[ns]', freq=None)

Но вместо этого кажется, что существует 3-дневный цикл, к которому относятся даты (предположительно, кратные 3 дням с 1 января 1970 г.?), поэтому вместо этого результат:

In[3]: x
Out[3]: 
DatetimeIndex(['2018-12-30', '2019-01-02', '2019-01-02', '2019-01-02',
               '2019-01-05', '2019-01-05', '2019-01-05'],
              dtype='datetime64[ns]', freq=None)

In[4]: y
Out[4]:
DatetimeIndex(['2022-01-01', '2022-01-01', '2022-01-01', '2022-01-04',
               '2022-01-04', '2022-01-04', '2022-01-07'],
              dtype='datetime64[ns]', freq=None)

Результаты для x начинаются 30 декабря, а не 1 января.

Есть ли способ установить «базу» для операции floor в pandas? Я говорю «база» из-за аргумента base в resample для выполнения аналогичных настроек. Но я не хочу выполнять агрегацию, просто сохраняю каждый элемент, но переназначаю метку времени.

1 Ответ

1 голос
/ 10 июля 2020
x = pd.date_range('01-01-2019', freq='1D', periods=7)
y = pd.date_range('01-01-2022', freq='1D', periods=7)

def floor(x, freq):
    offset = x[0].ceil(freq) - x[0]
    return (x + offset).floor(freq) - offset

print(floor(x, '3D'))
print(floor(y, '3D'))

Вывод

DatetimeIndex(['2019-01-01', '2019-01-01', '2019-01-01', '2019-01-04',
               '2019-01-04', '2019-01-04', '2019-01-07'],
              dtype='datetime64[ns]', freq=None)
DatetimeIndex(['2022-01-01', '2022-01-01', '2022-01-01', '2022-01-04',
               '2022-01-04', '2022-01-04', '2022-01-07'],
              dtype='datetime64[ns]', freq=None)

Добавление logi c:

def floor(x, freq):
    offset = x[0].ceil(freq) - x[0]
    adj_needed = (offset != pd.Timedelta(0))
    return (x + offset).floor(freq) - offset if adj_needed else x.floor(freq)
...