Панды: включить новые строки меток времени в кадр данных, если условие выполнено - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть датафрейм, который выглядит так:

    value                 timestamp
18.832939   2019-03-04 12:37:26 UTC
18.832939   2019-03-04 12:38:26 UTC
18.832939   2019-03-04 12:39:27 UTC
18.955200   2019-03-04 12:40:28 UTC
18.784912   2019-03-04 12:44:32 UTC
18.784912   2019-03-04 12:45:33 UTC
20.713936   2019-03-04 17:59:36 UTC
20.871742   2019-03-04 18:08:31 UTC
20.871742   2019-03-04 18:09:32 UTC
20.873871   2019-03-04 18:10:32 UTC

Мне нужен следующий результат, где я идентифицирую все промежутки времени, которые больше 2 минут, но меньше 15 минут (2

    value                 timestamp
18.832939   2019-03-04 12:37:26 UTC
18.832939   2019-03-04 12:38:26 UTC
18.832939   2019-03-04 12:39:27 UTC
18.955200   2019-03-04 12:40:28 UTC
      NaN   2019-03-04 12:41:28 UTC
      NaN   2019-03-04 12:42:28 UTC
      NaN   2019-03-04 12:43:28 UTC
18.784912   2019-03-04 12:44:32 UTC
18.784912   2019-03-04 12:45:33 UTC
20.713936   2019-03-04 17:59:36 UTC
      NaN   2019-03-04 18:00:36 UTC
      NaN   2019-03-04 18:01:36 UTC
      NaN   2019-03-04 18:02:36 UTC
      NaN   2019-03-04 18:03:36 UTC
      NaN   2019-03-04 18:04:36 UTC
      NaN   2019-03-04 18:05:36 UTC
      NaN   2019-03-04 18:06:36 UTC
      NaN   2019-03-04 18:07:36 UTC
20.871742   2019-03-04 18:08:31 UTC
20.871742   2019-03-04 18:09:32 UTC
20.873871   2019-03-04 18:10:32 UTC

Это означает, что для достижения этой цели я должен сделать две вещи:

  1. Определите, где пробелы соответствуют условию, которое я хочу. Потому что у нас могут быть промежутки, которые превышают 15 минут, и я не заинтересован в них.
  2. После определения создайте новые строки с 1-минутным увеличением или просто равномерно распределите значения с помощью меток времени.

Я могу сделать 1-й с этим:

df['aux_1'] = ((df['timestamp'].diff() > '0 days 00:02:00') & (df['timestamp'].diff() < '0 days 00:15:00')).astype(int) #get ending of the gap.
df['aux_2'] = df['aux_1'].shift(-1) #beginning of the gap.
df['intervals'] = df['aux_1'] + df['aux_2'] #both beginning and end with numeric consecutive flags contained in a single column.

Но я не уверен, как сделать вторую часть, по крайней мере, не "как Панды". Было бы идеально как-то определить начало-конец интервала времени, который я намереваюсь заполнить, а затем применить asfreq ('1m') и использовать этот вектор для заполнения желаемых пробелов. Просто не знаю, как это сделать правильно.

Может кто-нибудь мне помочь? Заранее спасибо.

1 Ответ

1 голос
/ 02 апреля 2019

Не очень, как панды, но я бы сделал следующее.

new_timestamp = []
for i, row in df.iterrows():
    if row['aux_2']==0:
        new_timestamp.append(row['timestamp'])
    elif row['aux_2']==1:
        new_timestamp += pd.date_range(row['timestamp'], df.iloc[i+1]['timestamp'], freq='min').to_list()

new_df = df.set_index('timestamp')
new_df = new_df.loc[new_timestamp]

это приводит к

print(new_df)
timestamp                   value       aux_1   aux_2   intervals
2019-03-04 12:37:26+00:00   18.832939   0.0     0.0     0.0
2019-03-04 12:38:26+00:00   18.832939   0.0     0.0     0.0
2019-03-04 12:39:27+00:00   18.832939   0.0     0.0     0.0
2019-03-04 12:40:28+00:00   18.955200   0.0     1.0     1.0
2019-03-04 12:41:28+00:00   NaN     NaN     NaN     NaN
2019-03-04 12:42:28+00:00   NaN     NaN     NaN     NaN
2019-03-04 12:43:28+00:00   NaN     NaN     NaN     NaN
2019-03-04 12:44:28+00:00   NaN     NaN     NaN     NaN
2019-03-04 12:44:32+00:00   18.784912   1.0     0.0     1.0
2019-03-04 12:45:33+00:00   18.784912   0.0     0.0     0.0
2019-03-04 17:59:36+00:00   20.713936   0.0     1.0     1.0
2019-03-04 18:00:36+00:00   NaN     NaN     NaN     NaN
2019-03-04 18:01:36+00:00   NaN     NaN     NaN     NaN
2019-03-04 18:02:36+00:00   NaN     NaN     NaN     NaN
2019-03-04 18:03:36+00:00   NaN     NaN     NaN     NaN
2019-03-04 18:04:36+00:00   NaN     NaN     NaN     NaN
2019-03-04 18:05:36+00:00   NaN     NaN     NaN     NaN
2019-03-04 18:06:36+00:00   NaN     NaN     NaN     NaN
2019-03-04 18:07:36+00:00   NaN     NaN     NaN     NaN
2019-03-04 18:08:31+00:00   20.871742   1.0     0.0     1.0
2019-03-04 18:09:32+00:00   20.871742   0.0     0.0     0.0 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...