Python pandas: замена отсутствующих значений во временном ряду

#python #python-3.x #pandas #datetime #time-series

#python #python-3.x #pandas #дата-время #временные ряды

Вопрос:

В настоящее время я работаю над процедурой для обработки метеоданных с разных метеостанций. К сожалению, время от времени отсутствуют данные. Я написал процедуру для объединения данных со всех станций во фрейм данных и внедрил столбец «NaN_Flag», в котором отображаются недостающие данные за определенный момент времени.

Теперь планируется заполнить эти пробелы данными ближайшей станции. Для температуры и влажности интерполяция была бы возможна, но в зависимости от размера разрыва на самом деле не идеальна. Для событий rain интерполяция не имела бы никакого смысла.

Первый столбец — это столбец индекса, содержащий дату, время и местоположение. Теперь я ищу решение для заполнения достоверных данных из другого местоположения (в то же время), если «NaN_Flag» показывает «1».

Итак, в следующем упрощенном примере я хотел бы, чтобы набор данных 01-01-01 00: 20:00 из Location1 автоматически заменялся данными того же datetime из Location2. Таким образом, у каждого местоположения есть «резервное» местоположение, и каждый раз, когда «NaN_Flag» показывает «1», данные автоматически заменяются соответствующими данными резервной копии. У кого-нибудь есть идеи, как этого добиться?

 DATETIME_UTC_LOCATION           DATETIME_UTC              LOCATION    TEMP   PLUV   HUM   NaN_FLAG 
2020-01-01 00:00:00 Location1   2020-01-01 00:00:00       Location1   5.25   0.0    87.3  0
2020-01-01 00:10:00 Location1   2020-01-01 00:10:00       Location1   6.12   0.1    85.0  0
2020-01-01 00:20:00 Location1   2020-01-01 00:20:00       Location1                       1
2020-01-01 00:00:00 Location2   2020-01-01 00:00:00       Location2   5.12   0.0    88.9  0
2020-01-01 00:10:00 Location2   2020-01-01 00:10:00       Location2   6.25   0.1    84.3  0
2020-01-01 00:20:00 Location2   2020-01-01 00:20:00       Location2   6.75   0.2    82.5  0

  

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

1. с научной точки зрения, не кажется ли вам, что адаптация значений близлежащих станций привела бы к статистическому искажению? или спросили по-другому: почему оставить недостающие значения как NaN не является опцией?

2. Вы определенно правы насчет статистической погрешности. Тем не менее, проблема в том, что я загружаю эти данные в разные модели моделирования заболеваний, и некоторые из них не способны обрабатывать промежутки дольше одного часа и просто перестают работать. Поэтому введение смещения менее проблематично. Кроме того, у меня также есть местоположения с 2 метеостанциями в одном месте, а также дополнительные данные, сгенерированные алгоритмом, которые могли бы выступать в качестве более или менее надежной резервной копии.

Ответ №1:

Если имеющийся у вас фрейм данных имеет формат, эквивалентный этому:

 import pandas as pd
import numpy as np


df = pd.DataFrame(data={'month': ["Jan","Feb","Mar","Jan","Feb","Mar"],
                        'station': ["station_1","station_1","station_1","station_2","station_2","station_2"],
                        'values': [3.2, np.nan, 4.1, 3.6, 5.8, 4.2]}).set_index('month')
  

вывод:

               station   values
    month       
    Jan       station_1    3.2
    Feb       station_1    NaN
    Mar       station_1    4.1
    Jan       station_2    3.6
    Feb       station_2    5.8
    Mar       station_2    4.2
  

Вы можете использовать:

 df.loc[df['station'] == "station_1"] = df.loc[df['station'] == "station_1"].fillna(df.loc[df['station'] == "station_2"])
  

чтобы заменить значения NaN станции 1 на эквивалентные значения станции 2. Под «эквивалентным» я подразумеваю совпадение в индексе «месяца».

Вывод:

               station   values
    month       
    Jan       station_1    3.2
    Feb       station_1    5.8
    Mar       station_1    4.1
    Jan       station_2    3.6
    Feb       station_2    5.8
    Mar       station_2    4.2
  

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

1. Большое вам спасибо. В настоящее время все разные местоположения находятся в одном csv / dataframe. Но разделение не было бы проблемой, если бы не было другого варианта. В настоящее время индекс равен datetime_location. Ваше решение будет работать, если я создам фрейм данных для каждого местоположения, где datetime является индексом, и я вставлю столбец location после замены отсутствующих данных. В любом случае, если кто-то придумал способ заставить это работать в объединенном фрейме данных, я бы предпочел это.

2. Ах, хорошо, я полагаю, что понимаю. В этом случае вы можете выполнить замену значений NaN в столбце на значения в другом столбце, подобные этому: df.column_with_nans. fillna(df.column_second_station, inplace=True), где, как указано в именах, «column_with_nans» — это имя столбца с отсутствующими значениями, а «column_second_station» — это столбец со значениями из соседней станции.

3. Нет, извините, возможно, я неправильно объяснил. Как вы видите в моем примере dataframe. дата-время, местоположение, температура, влажность…. находятся в разных столбцах, а временные ряды разных местоположений — в строках.

4. Да, вы абсолютно правы, я отредактировал свой ответ, поэтому нет необходимости создавать новые фреймы данных, используя (довольно длинную) однострочную строку, дайте мне знать, имеет ли это смысл сейчас.

5. Извините за поздний ответ… не удалось добраться до этого раньше. Да, похоже, это работает отлично. Большое вам спасибо!