Создание композитов из данных наблюдений с пробелами в данных во времениPython

Программы на Python
Ответить
Гость
 Создание композитов из данных наблюдений с пробелами в данных во времени

Сообщение Гость »


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

Я пытаюсь создать четырехчасовую композицию, посвященную проходу с морским бризом. Так что для каждого случая это время разное, но композит должен составлять 4 часа. Поскольку времена разные, я не могу просто создать идеальную переменную времени (скажем, 18-23UTC), а вместо этого мне нужна переменная относительного времени (от -2 часов до +2 часов).

В настоящее время у меня возникают проблемы с обработкой пропавших данных. В настоящее время данные обстоят так: если данные отсутствуют, то они просто перескакивают во времени (например, данные 16-18, а затем 19-24).

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

Пример файла данных можно найти по адресу: https://data.nssl.noaa.gov/thredds/cata ... talog.html< /п> Ниже приведен фрагмент кода, который включает чтение файлов/данных, создает время начала/окончания, находит индексы времени начала/окончания и извлекает соответствующие данные.

Однако, если разрыв данных возникает в момент начала/окончания, это становится проблемой.
`""" Тестирование композитов """ из ipywidgets импортировать взаимодействие из datetime импорта datetime, date, timedelta из siphon.catalog импортировать TDSCatalog импорт cmocean импортировать matplotlib.dates как mdates импортировать matplotlib.pyplot как plt импортировать numpy как np из набора данных импорта netCDF4 импортировать ОС импортировать xarray как xr импортировать глобус импортировать панд как pd def find_closest(A, цель): """ Эта функция находит индекс ближайшего значения к целевое значение с указанным массивом. Источник: Джереми Гиббс (NOAA-NSSL). Аргументы: A (массив): данные для поиска ближайшего значения. цель (float): искомое значение. Возврат: idx (int): индекс A со значением, наиболее близким к целевому. """ idx = A.searchsorted(target) # A должен быть отсортирован idx = np.clip(idx, 1, len(A)-1) слева = A[idx-1] вправо = A[idx] idx -= цель - слева < справа - цель вернуть идентификатор def decimal_hours_to_datetime(decimal_hours, лет, месяцев, дней): datetime_list = [] для меня часы в перечислении (decimal_hours): start_time = datetime(год=год, месяц=месяцы, день=дни) # Вычисляем дельту времени, соответствующую десятичным часам timedelta_hours = timedelta(часы=часы) # Добавьте временную дельту ко времени начала, чтобы получить объект datetime datetime_obj = start_time + timedelta_hours datetime_list.append(datetime_obj) вернуть список_даты и времени savelocation = "/Users/michellerosespencer/Documents/phd/" # Составьте списки со всеми данными, необходимыми для c1 input_files_c1 = glob.glob('/Users/michellerosespencer/Documents/phd/pblh_invest/data/sea_breeze_days/clampstropoe10.aeri.v1.C1.*.nc') input_files_c1.sort() pblh_files_c1 = glob.glob('/Users/michellerosespencer/Documents/phd/pblh_invest/data/sea_breeze_days/*C1fuz*.nc') pblh_files_c1.sort() #%% # Создайте список дат для дней морского бриза C1 # Этот список ВКЛЮЧАЕТ дни после dt_c11 = [] для диапазона (5,7): dat = дата(2022, 6, а).isoformat() dt_c11.append(дат) для диапазона (8,13): dat = дата(2022, 6, а).isoformat() dt_c11.append(дат) #%% # Превращаем десятичные часы/дни в объекты datetime для c1 decimal_hours_c1 = [1] лет_c1 = [2022] месяцы_c1 = [6] дни_c1 = [11] datetime_objects_c1 = decimal_hours_to_datetime(decimal_hours_c1,years_c1,months_c1,days_c1) sb_times_c1 = datetime_objects_c1 #%% # Создайте пустые списки, чтобы мы могли добавлять наши ежедневные, нарезанные морским бризом 6-часовые переменные окна к мастеру # массив, который мы затем можем усреднить для создания составных частей каждой переменной комп_темп = [] comp_wv = [] comp_pblh = [] #%% # Создать общую временную сетку — основная переменная t_bin = дельта времени (минуты = 10) # t_bin = np.arange(-7195.0, 7805.0, 600) # Инициализируем пустые массивы для композитов на основе размеров основных массивов времени и высоты Composite_pblh = np.zeros((len(t_bin), 55)) Composite_temp = np.zeros((len(t_bin), 55)) Composite_wv = np.zeros((len(t_bin), 55)) для j в диапазоне (0, len(dt_c11)): если j == 5: # Откройте набор данных nc_thermo1 = Набор данных (input_files_c1[j]) nc_thermo2 = Набор данных (input_files_c1[j+1]) nc_pblh1 = Набор данных (pblh_files_c1[j]) nc_pblh2 = Набор данных (pblh_files_c1[j+1]) t_1 = nc_thermo1['base_time'][:] + nc_thermo1['time_offset'][:] t_2 = nc_thermo2['base_time'][:] + nc_thermo2['time_offset'][:] time_1 = np.append(t_1, t_2) час = np.array([datetime.utcfromtimestamp(e) для e в time_1]) h_1 = nc_thermo1.variables['высота'][:] h_2 = nc_thermo2.variables['высота'][:] высота = h_1 temp1 = nc_thermo1.variables['theta'][:,:] temp2 = nc_thermo2.variables['theta'][:,:] temp = np.append(temp1, temp2, ось = 0) wv1 = nc_thermo1.variables['waterVapor'][:,:] wv2 = nc_thermo2.variables['waterVapor'][:,:] wv = np.append(wv1, wv2, ось = 0) cbh1 = nc_thermo1.variables['cbh'][:] cbh2 = nc_thermo2.variables['cbh'][:] cbh = np.append(cbh1, cbh2, ось = 0) t_1 = nc_pblh1['t_epoch'][:] t_2 = nc_pblh2['t_epoch'][:] time_2 = np.append(t_1,t_2) час2 = np.array([datetime.utcfromtimestamp(e) для e в time_2]) pblh1 = nc_pblh1.variables['pblh'][:] pblh2 = nc_pblh2.variables['pblh'][:] pblh = np.append(pblh1, pblh2, ось = 0) t1 = nc_thermo1['час'][:] t2 = nc_thermo2['час'][:] т2 = т2 + 24 т = np.append(t1, t2) nc_thermo1.close() nc_thermo2.close() nc_pblh1.close() nc_pblh2.close() # Создайте время начала и окончания, чтобы мы могли индексировать переменные t_delta = дельта времени (часы = 2) start_time = sb_times_c1 - t_delta конечное_время = sb_times_c1 + t_delta # Найдите индексы времени начала и окончания start_idx = np.argmin(np.abs(hour2 - start_time)) end_idx = np.argmin(np.abs(hour2 - end_time)) start_idx_thermo = np.argmin(np.abs(час - start_time)) end_idx_thermo = np.argmin(np.abs(час - end_time)) # Извлекаем данные, соответствующие индексам temp = temp[start_idx_thermo:end_idx_thermo, :] wv = wv[start_idx_thermo:end_idx_thermo, :] pblh = pblh[start_idx:end_idx] cbh = cbh[start_idx_thermo:end_idx_thermo] # Создать идеальную временную ось/окно window_time = час[start_idx_thermo:end_idx_thermo] rel_time = window_time - sb_times_c1 # Преобразование относительного временного окна в целые числа (секунды) для я в диапазоне (0, len(rel_time)): rel_time = rel_time.total_секунды()`
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»