Pandas: добавление новых строк с равномерно расположенными временными метками при заданном условии

#python #pandas #dataframe #timestamp

#python #pandas #фрейм данных #временная метка

Вопрос:

У меня есть следующий фрейм данных:

     value                 timestamp
20.713936   2019-03-04 17:59:36 UTC
20.871742   2019-03-04 18:08:31 UTC
  

Я хотел бы добавить новые строки в dataframe в зависимости от разницы во времени столбца временных меток (если это больше 1 минуты, но меньше 15 минут). Это должно выглядеть, хотя и не совсем так:

     value                 timestamp
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
  

Я думал о создании функции, которая делала бы что-то вроде этого:

  1. вычислите разницу во времени между двумя временными метками и проверьте условие.
  2. Если условие истинно, найдите разницу в минутах и используйте это, чтобы узнать, сколько строк я собираюсь вставить (если разница в минутах равна 9, тогда я вставлю 8 новых строк).
  3. Заполните новые строки временными метками с шагом последовательных 1 минут.

Поскольку Pandas настолько мощный, мне было интересно, есть ли способ достичь той же цели без необходимости писать эти функции и избегать использования циклов if / for.

Я думаю, что просто добавить 1 к каждой предыдущей временной метке проще, чем найти вектор временной метки с равным интервалом.

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

Кто-нибудь знает, как это сделать?

Спасибо за ваше время!

Ответ №1:

Используя pandas.to_datetime и pandas.DataFrame.asfreq :

 import pandas as pd

df
       value           timestamp
0  20.713936 2019-03-04 17:59:36
1  20.871742 2019-03-04 18:08:31

df['timestamp'] = pd.to_datetime(df['timestamp'])
new_df = df.set_index('timestamp', drop=True)
new_df = new_df.asfreq('1min').reset_index().append(df.iloc[-1]).reset_index(drop=True)
  

Вывод:

             timestamp      value
0 2019-03-04 17:59:36  20.713936
1 2019-03-04 18:00:36        NaN
2 2019-03-04 18:01:36        NaN
3 2019-03-04 18:02:36        NaN
4 2019-03-04 18:03:36        NaN
5 2019-03-04 18:04:36        NaN
6 2019-03-04 18:05:36        NaN
7 2019-03-04 18:06:36        NaN
8 2019-03-04 18:07:36        NaN
9 2019-03-04 18:08:31  20.871742
  

Комментарии:

1. Спасибо за это, Крис. Как я могу заставить это делать, только если разница во времени между ними составляет от 1 минуты до 15 минут? Я могу получить разницу в новом столбце, скажем, df [‘t_test’]= (df [‘timestamp’].diff()>’0 дней 00: 01:00′) amp;(df[‘timestamp’].diff()<‘0 дней 00: 15:00’) Как я могу применить это только к значениям, которые соответствуют этим критериям для промежутков между временными метками?

Ответ №2:

вам следует взглянуть на pandas.date_range(). Я думаю, это то, что вы ищете.