Pandas — повторная выборка минутного интервала нерегуляризованных данных за 3-часовой интервал и замена отсутствующих данных данными за определенный период времени.

У меня есть нерегулируемые данные с интервалом в одну минуту, например:

Date                Vel     Dir
14-11-2001 17:55:00 14.1    35
14-11-2001 17:56:00 10.4    52
14-11-2001 17:57:00 14.8    19
14-11-2001 18:04:00 11.4    54
14-11-2001 18:05:00 7.6     13

Я хочу передискретизировать эти данные с интервалом в 3 часа (0,3,6,9,12,15,18,21) таким образом, что если, например, данные в час 18 и минута 00 отсутствуют, я замените его ближайшими данными в диапазоне пяти минут после или до минуты 00. В этом примере у меня есть время 17 57 ближе к 18 00, чем 18 04, поэтому я заменяю данные для отсутствующего времени 18 00 данными 17 57 следующим образом:

14-11-2001 15:00:00 5.8     43
14-11-2001 18:00:00 14.8    19
14-11-2001 21:00:00 17.4    68

Если у меня нет данных в интервале пяти минут после или до минуты 00, я не заполняю недостающие данные, оставляя час с NaN следующим образом:

14-11-2001 15:00:00 5.8     43
14-11-2001 18:00:00 NaN     NaN
14-11-2001 21:00:00 17.4    68

Я пытаюсь сделать это с помощью команды .resample('3H') панд, но я не знаю, как это сделать, заменив отсутствующие значения ближайшими данными в диапазоне пяти минут.

Я попытался использовать np.searchshorted, но мне не удалось установить с ним диапазон в пять минут, поэтому я отказываюсь от этой идеи.

Мой код сейчас очень прост, я просто читаю текстовый файл с данными и передискретизирую его с интервалом в 3 часа без замены данных, поэтому мои данные выглядят так, когда я извлекаю их для текстового файла:

Date                Vel     Dir
14-11-2001 15:00:00 5.8     43
14-11-2001 18:00:00     
14-11-2001 21:00:00 17.4    68

Код:

import numpy as np 
import pandas as pd
dateparse = lambda x: pd.datetime.strptime(x,'%d %m %Y %H %M')
vento= pd.read_csv('vento.txt',header=0, delim_whitespace= True, parse_dates = [['Dia', 'Mes', 'Ano', 'Hora','Minuto']], index_col = 0, date_parser = dateparse)

vento_2=vento.resample('3H')
vento_2.to_csv(r'data.txt',index=True, index_label=None, sep='\t')

person Italo Lopes    schedule 24.04.2017    source источник


Ответы (2)



Спасибо за помощь и извините за задержку с ответом. Ваш ответ мне очень помог, но из-за моих данных мне пришлось внести несколько изменений. В итоге мой код выглядит следующим образом (видно изменение диапазона интервала на 3 минуты вместо 5):

import numpy as np 
import pandas as pd


dateparse = lambda x: pd.datetime.strptime(x,'%d %m %Y %H %M')

vento = pd.read_csv('vento.txt',header=0, delim_whitespace= True, parse_dates = [['Dia', 'Mes', 'Ano', 'Hora','Minuto']], index_col = False, date_parser = dateparse)
vento1 = vento.rename(columns={'Dia_Mes_Ano_Hora_Minuto': 'Data'})
vento_time = pd.DataFrame({'Data':pd.date_range(start='2016-07-12 18:00:00',end='2017-02-28 21:00:00',freq='3H')})
vento_2 = pd.merge_asof(vento_time,vento1, on='Data',tolerance=pd.Timedelta("3 minutes")).fillna('NAN')
vento_3 = vento_2.convert_objects(convert_numeric=True)
vento_3.set_index(['Data'], inplace=True)
vento_3.to_csv('vento_3min.csv') 
person Italo Lopes    schedule 02.05.2017