который будет принимать существующий фрейм данных с индексом DatetimeIndex и возвращать новый фрейм данных с индексом, заданным newTime. Для каждого столбца значения нового кадра данных должны оцениваться путем интерполяции значений исходного кадра данных. По сути, эта функция должна вести себя аналогично numpy.interp. Мне известен метод pandas.DataFrame.interpolate, однако он интерполирует существующие значения NAN и не принимает новый индекс в качестве аргумента.
На данный момент у меня есть 2 идеи
Добавить новый индекс и конец кадра данных со всеми значениями, равными NAN, а затем удалить повторяющиеся индексы для точных меток времени, которые уже существуют. , затем используйте метод интерполяции pandas, а затем выбирайте только строки с новым индексом.
Преобразуйте фрейм данных в массив numpy. Прокрутите столбцы, используйте интерполяцию numpy, а затем преобразуйте обратно в фрейм данных.
Оба варианта, безусловно, будут работать, но они довольно уродливы. Есть ли способ сделать это? Изменить: минимальный пример
Важное ПРИМЕЧАНИЕ. Исходные значения могут быть смещены относительно новых значений, например, они могут быть заданы с почасовой точностью. Поэтому возможно, что ни одна точка исходного индекса не соответствует новому индексу.
Я ищу функцию [code]pandas_interpolate(df: pd.DataFrame, newTime: pd.DatetimeIndex, method: str = 'linear') -> pd.DataFrame [/code] который будет принимать существующий фрейм данных с индексом DatetimeIndex и возвращать новый фрейм данных с индексом, заданным newTime. Для каждого столбца значения нового кадра данных должны оцениваться путем интерполяции значений исходного кадра данных. По сути, эта функция должна вести себя аналогично numpy.interp. Мне известен метод pandas.DataFrame.interpolate, однако он интерполирует существующие значения NAN и не принимает новый индекс в качестве аргумента. На данный момент у меня есть 2 идеи [list] [*]Добавить новый индекс и конец кадра данных со всеми значениями, равными NAN, а затем удалить повторяющиеся индексы для точных меток времени, которые уже существуют. , затем используйте метод интерполяции pandas, а затем выбирайте только строки с новым индексом. [*]Преобразуйте фрейм данных в массив numpy. Прокрутите столбцы, используйте интерполяцию numpy, а затем преобразуйте обратно в фрейм данных. [/list] Оба варианта, безусловно, будут работать, но они довольно уродливы. Есть ли способ сделать это? [b]Изменить[/b]: минимальный пример [code]df = pd.DataFrame({'value': [1, 2, 3]}, index=pd.DatetimeIndex(['2024-01-01', '2024-01-15', '2024-01-30']))
newTime = pd.date_range(start=df.index[0], end=df.index[-1], freq='1D') [/code] что приводит к появлению newTime [code]DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05', '2024-01-06', '2024-01-07', '2024-01-08', '2024-01-09', '2024-01-10', '2024-01-11', '2024-01-12', '2024-01-13', '2024-01-14', '2024-01-15', '2024-01-16', '2024-01-17', '2024-01-18', '2024-01-19', '2024-01-20', '2024-01-21', '2024-01-22', '2024-01-23', '2024-01-24', '2024-01-25', '2024-01-26', '2024-01-27', '2024-01-28', '2024-01-29', '2024-01-30'], dtype='datetime64[ns]', freq='D') [/code] Тогда ожидаемый результат функции должен быть (я взломал его здесь) [code]pd.DataFrame({'value': np.interp(np.arange(1, 31), [1,15,30], [1,2,3])}, index=newTimes) [/code] это [code]value 2024-01-01 1.000000 2024-01-02 1.071429 2024-01-03 1.142857 2024-01-04 1.214286 2024-01-05 1.285714 2024-01-06 1.357143 2024-01-07 1.428571 2024-01-08 1.500000 2024-01-09 1.571429 2024-01-10 1.642857 2024-01-11 1.714286 2024-01-12 1.785714 2024-01-13 1.857143 2024-01-14 1.928571 2024-01-15 2.000000 2024-01-16 2.066667 2024-01-17 2.133333 2024-01-18 2.200000 2024-01-19 2.266667 2024-01-20 2.333333 2024-01-21 2.400000 2024-01-22 2.466667 2024-01-23 2.533333 2024-01-24 2.600000 2024-01-25 2.666667 2024-01-26 2.733333 2024-01-27 2.800000 2024-01-28 2.866667 2024-01-29 2.933333 2024-01-30 3.000000 [/code] [b]Важное ПРИМЕЧАНИЕ[/b]. Исходные значения могут быть смещены относительно новых значений, например, они могут быть заданы с почасовой точностью. Поэтому возможно, что ни одна точка исходного индекса не соответствует новому индексу.
У меня есть DataFrame Pandas с столбцом с временными метками и столбцом значений, и я хочу сделать линейную интерполяцию и получить значения для различных временных метков.
DataFrame выглядит следующим образом: