Как мне пересчитать нерегулярный таймфрейм данных в pandas, выбрав ближайший без интерполяции - PullRequest
0 голосов
/ 17 апреля 2020

Я не могу найти это нигде, так что извините, если это дубликат. У меня есть несколько больших наборов данных, которые имеют нерегулярные временные ряды. Я хотел бы добавить их к не чаще , чем каждые x минут, сгруппированные по указанному c id, но сохранить первоначальную метку времени. Набор данных выглядит следующим образом:

df = pd.DataFrame({'id': [101,101,101,101,106,106,106],
                            'ti': [pd.Timestamp('2020-04-02T09:56:46'),
                                 pd.Timestamp('2020-04-02T10:17:01'),
                                 pd.Timestamp('2020-04-02T10:21:02'),
                                 pd.Timestamp('2020-04-02T10:37:09'),
                                 pd.Timestamp('2020-04-02T09:56:03'),
                                 pd.Timestamp('2020-04-02T09:59:34'),
                                 pd.Timestamp('2020-04-02T10:10:20')],
                           'lat': [-36.006335, -36.004282, -36.003927,
                                   -36.002455,-36.211260,-36.213578,
                                   -36.216875]}) 

В идеале, я хотел бы иметь что-то подобное каждые 15 минут, например:

dfs = df.set_index('ti').groupby('id').resample('15T').nearest()

id        ti                  lat               
101  2020-04-02 09:56:46  -36.006335    
101  2020-04-02 10:17:01  -36.004282    
101  2020-04-02 10:37:09  -36.002455    
106  2020-04-02 09:56:03  -36.211260     
106  2020-04-02 10:10:20  -36.216875    

, но я действительно получаю следующее:

                          id        lat
id  ti                                 
101 2020-04-02 09:45:00  101 -36.006335
    2020-04-02 10:00:00  101 -36.006335
    2020-04-02 10:15:00  101 -36.004282
    2020-04-02 10:30:00  101 -36.002455
106 2020-04-02 09:45:00  106 -36.211260
    2020-04-02 10:00:00  106 -36.213578

Если я использую '15m', это только сохранение первой отметки времени каждого идентификатора.

Я также представляю, что есть способ сгруппировать по идентификатору, получить минимальное / максимальное время, вычислить количество точек, которые могли бы существовать, если бы они были теоретически с ~ x минутными интервалами и основаны на выборке, основанной на этом.

Заранее благодарен за любую помощь.

1 Ответ

0 голосов
/ 29 апреля 2020

Это близко:

df.sort_values(by=['id','ti'], inplace=True, ascending=True)

#Make redundant timestamp to use later
df['t0'] = df['ti']
#Get closest points to 15 minute time series
dfs = df.set_index('ti').groupby('id').resample('15T').nearest()

#Fix Indices
dfs = dfs.reset_index(level=['ti'])
dfs = dfs.reset_index(drop=True,inplace=False)

#Find values closest to 15 minute interval and remove others duplicates
dfs['tf'] = abs(dfs.t0-dfs.ti).astype('timedelta64[m]')
dfs = dfs.sort_values('tf').drop_duplicates(subset=['id','t0'], keep='first')

dfs = dfs.sort_index()
...