Потому что это все веселье и игры, пока угол не изменится с 355 на 5 градусов.

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

Кажется простым, если направление изменилось с 350 градусов на 320 градусов, вычесть одно из другого, получить абсолютное значение, и это изменение на 30 градусов. Но подождите, подождите минутку…

Изменение с 350 градусов на 5 градусов является изменением либо на 15, либо на 345 градусов, в зависимости от того, в каком направлении происходит изменение. Точно так же изменение с 250 градусов на 200 градусов может быть 50 или 450. Если вы работаете с большими наборами данных (или просто цените свое время), просто невозможно открывать огромные файлы, вручную проверяйте каждый из них. и отредактируйте для правильного результата. И вы, и ваш компьютер, вероятно, сдались бы, поэтому необходимо автоматизированное решение.

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

Оглавление

1. Необходимое предположение

«2. Код"

«3. Объяснение"

Необходимое предположение

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

Если направление изменилось с 350 на 5, это изменение составляет 15 градусов, если и толькоесли,оно движется по часовой стрелке. Т.е.если направление ветра меняется от 350, до 351, 352….. 359, 0, 1…5 градусов. Существует также вероятность того, что направление ветра могло измениться с 350 до 349, 348, …. 6, 5 градусов или против часовой стрелки. Два варианта показаны ниже.

Возможны ли обе ситуации на самом деле, будет зависеть от типа данных и детализации данных. Например, возможно ли изменение курса судна на 190 градусов за три секунды? Может ли экстремальная погода вызвать резкое изменение направления ветра?

Чтобы предлагаемое решение работало, мы должны исходить из того, что изменение направления более чем на 180 градусов в заданный период невозможно. т.е. если данные представляют собой временные ряды с точностью до одной минуты, с минуты 1 до минуты 2 подлинное изменение направления более чем на 180 градусов невозможно.

Если это не работает для вашего набора данных, будьте предельно осторожны! Рассмотрите любые другие имеющиеся у вас точки данных, которые могут подтвердить или опровергнуть эту теорию, и, если возможно, получить данные с более высокой частотой, чтобы это предположение могло стать верным.

Код

Это не идеальное решение для Python, но в моем случае оно работает. Фрагмент ниже использует библиотеку pandas, документацию для которой можно найти здесь.

# find diff between min and max wind direction
df['delta'] = df.max_winddirection - df.min_winddirection
    
# check for if difference minimun < max - 180, if so, use different equation to get degree change
  
df.loc[df.min_winddirection < df.max_winddirection - 180, 'delta'] = 360 - df.max_winddirection + df.min_winddirection

Объяснение

Возьмем пример с 350 до 5 градусов.

  1. Приведенный выше код сначала выделяет всем строкам базовое дельта-уравнение «максимальный угол — минимальный угол». Это применит 350 в качестве дельты для этой строки.
  2. Код проверяет, удовлетворяются ли критерии для этих случаев «через север». Это проверит, если: «минимальный угол‹ максимальный угол — 180». В этом случае 5 меньше (350–180), поэтому это ИСТИНА.
  3. Код применяет новое уравнение для дельты, когда значение TRUE равно «360 — максимальный угол + минимальный угол». В результате получается 15 градусов.

Если критерий «через север» не выполняется, базовая формула «максимум минус минимум» будет применяться без каких-либо проблем.

Надеюсь, вы нашли это полезным. Если у вас есть более чистое альтернативное решение, которое я хотел бы извлечь из него, не стесняйтесь оставлять его в комментариях.