Выбор строк на основе значения, ближайшего к

#python

#python

Вопрос:

У меня есть radiosondes фрейм данных, который содержит много данных радиозондирования. Сейчас выполняются сотни радиозондов, все с уникальной меткой времени, поэтому фрейм данных имеет datetimeindex . Я хочу, чтобы временные ряды переменных (температура, давление и т.д.) основывались на определенном уровне давления. Таким образом, в основном каждый отдельный радиозонд должен давать мне значения других переменных для определенного уровня давления. Проблема возникает из-за того, что интервал давления не является однородным и записывается в 2 десятичных знака. Кроме того, каждый радиозонд имеет разный интервал давления, поскольку измерения проводились каждую секунду, а не на основе давления. То, что я сделал, было следующим:

 x = radiosondes[(radiosondes['Press'] >= 500) amp; (radiosondes['Press'] <= 501)]
 

Теперь эта строка дала мне несколько правильных данных, но не совсем так, как вы видите в результатах ниже: некоторые временные метки включаются несколько раз, потому что они имеют несколько измерений, где давление составляло от 500 до 501 ГПа.

                   Press  GeopHgt   Temp  RH  PO3  GPSHgt  O3
datetime                                                        
2019-09-21 05:00:00  500.86     5263  237.4  79  NaN  5279.0 NaN
2019-09-21 05:00:00  500.49     5268  237.4  78  NaN  5285.0 NaN
2019-09-21 05:00:00  500.12     5273  237.3  76  NaN  5290.0 NaN
2019-09-22 04:00:00  500.64     5359  243.5  54  NaN  5369.0 NaN
2019-09-22 04:00:00  500.14     5368  243.4  54  NaN  5378.0 NaN
...                     ...      ...    ...  ..  ...     ...  ..
2020-10-01 11:00:00  500.68     5443  244.6  63  NaN  5460.0 NaN
2020-10-01 11:00:00  500.29     5449  244.6  63  NaN  5466.0 NaN
2020-10-01 14:00:00  500.92     5465  245.1  29  NaN  5485.0 NaN
2020-10-01 14:00:00  500.55     5469  245.1  29  NaN  5490.0 NaN
2020-10-01 14:00:00  500.16     5474  245.1  28  NaN  5496.0 NaN
 

Итак, я хочу, чтобы каждый радиозонд включался только один раз в новые временные ряды. Я хотел бы выбрать строку, в которой давление ближе всего к 500. Итак, результат будет примерно таким:

                           Press  GeopHgt   Temp  RH  PO3  GPSHgt  O3
datetime                                                        
2019-09-21 05:00:00  500.12     5273  237.3  76  NaN  5290.0 NaN
2019-09-22 04:00:00  500.14     5368  243.4  54  NaN  5378.0 NaN
...                     ...      ...    ...  ..  ...     ...  ..
2020-10-01 11:00:00  500.29     5449  244.6  63  NaN  5466.0 NaN
2020-10-01 14:00:00  500.16     5474  245.1  28  NaN  5496.0 NaN
 

Надеюсь, понятно, что я здесь имел в виду. Заранее большое спасибо!

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

1. Можете ли вы продемонстрировать какие- либо усилия по решению этой проблемы самостоятельно?

2. Могли бы вы также предоставить входные данные с помощью объекта dataframe, чтобы мы могли их воспроизвести?

Ответ №1:

Чтобы добиться этого, вы можете сделать следующее: если ваш фрейм данных равен x, и учитывая, что вы ищете давление как можно ближе к 500, значит, оно равно минимальному давлению между 500 и 501:

 print(x.loc[x.groupby("datetime")["Press"].idxmin()])
 

Это сохранит одну строку на группу даты и времени с минимальным давлением, поэтому ближе всего к 500.

Ответ №2:

После первоначальной манипуляции выполните:

 x.sort_values('Press').drop_duplicates('date').sort_index()
 

После этого вам может потребоваться повторно отсортировать ваш фрейм данных в отношении метки времени, что является тривиальным.