#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
Я думал о создании функции, которая делала бы что-то вроде этого:
- вычислите разницу во времени между двумя временными метками и проверьте условие.
- Если условие истинно, найдите разницу в минутах и используйте это, чтобы узнать, сколько строк я собираюсь вставить (если разница в минутах равна 9, тогда я вставлю 8 новых строк).
- Заполните новые строки временными метками с шагом последовательных 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(). Я думаю, это то, что вы ищете.