как извлечь данные ECMWF ERA-5 по точкам следов животных?

Я хочу извлечь / интерполировать значение температуры воздуха для каждого местоположения трека (в пространстве [xy], времени [t] и высоте) из почасовых данных об уровне давления ERA5.

Я получил набор данных ERA5 с помощью панели инструментов CDS, как показано ниже. Но я не мог понять, как извлечь значения для каждой точки. Я безуспешно пытался использовать инструмент ct.observation.interp_from_grid() в панели инструментов CDS.

import cdstoolbox as ct

# Initialise the application
@ct.application(title='my trial to retrieve and annotate movement data')

# Define a download output for the application
@ct.output.download()

# Define application function
def application():
    """Define a function that extracts hourly Air Temperature in 2018 for track points and provides a download link.

    # Retrieve hourly air temperature
    data = ct.catalogue.retrieve(
        'reanalysis-era5-pressure-levels',
        {
            'variable': 'temperature',
            'product_type': 'reanalysis',
            'pressure_level': [
            '900', '925', '950',
        ],
            'year': 2018,
            'month': '05',
            'day': '01',
            'time': [
                '00:00', '01:00', '02:00', '03:00',
                '04:00', '05:00', '06:00', '07:00',
                '08:00', '09:00', '10:00', '11:00',
                '12:00', '13:00', '14:00', '15:00',
                '16:00', '17:00', '18:00', '19:00',
                '20:00', '21:00', '22:00', '23:00',
            ],
        'area': [
            48, 111, 47,
            112,
        ],
            }
    )
    # Interpolate data for track points
    indexers = {'lon': [146.29, 147.10], 'lat': [-6.689, -7.644], 'plev':['891', '653'], 'time':['2019-03-23 18:52:29', '2019-03-23 21:52:30']}
    points = ct.observation.interp_from_grid(data, method='nearest', drop='False', wrap_lon='False', **indexers)    
    
    print(points)
    return points

В качестве альтернативы я могу сначала загрузить данные ERA5, а затем использовать функцию извлечения растрового пакета в R. Однако я не хочу загружать огромное количество наборов данных (возможно, сотни ГБ, даже ТБ) на свой компьютер, поскольку мой трек точки охватывают большие пространственные и временные масштабы.

вот фиктивные точки трека только для демонстрации.

structure(list(Latitude = c(-6.689718, -7.644683, -8.31021, -9.177921, 
-9.493564), Longitude = c(146.297638, 147.107101, 148.211472, 
148.670151, 149.00795), timestamp = c("2019-03-23 15:52:14", 
"2019-03-23 18:52:29", "2019-03-23 21:52:30", "2019-03-24 00:52:29", 
"2019-03-24 03:52:15"), altitude_hPa = c(891, 653, 521, 910, 
711)), class = "data.frame", row.names = c(NA, -5L)) 

Буду очень благодарен за любые предложения или другие способы сделать это.

заранее спасибо,

Летучая мышь

1 ответ

Hy Bat

Я до сих пор не знал о cdstoolbox, но немного более подробно рассмотрел ваш запрос на демонстрацию (использовал cdstoolbox-remote; очень удобно!). Я нашел проблему в interp_from_grids метод, который содержит следующую строку (и) кода:

if 'time' in indexers:
   indexers['time'] = indexers['time'].astype('float64')

Если indexers содержит "time" метод пытается преобразовать его в float64, что не работает с str listв вашей демонстрации. Чтобы обойти это, я преобразовал"time" массив в numpy.datetime64объект. Что-то типа:

numpy.array(['2019-03-23 18:52:29', '2019-03-23 21:52:30'], dtype = 'datetime64')

Это решает "AttributeError: 'list' object has no attribute 'astype'" ошибка (поскольку теперь ее можно преобразовать в float64), однако это не сериализуемый JSON (новая ошибка: "AttributeError: 'list' object has no attribute 'astype'").

На данный момент я немного потерялся - работает ли вообще интерполяция по времени? Метод (еще глубже копать не успел) вроде справляется"time"однако как-то не могу найти пример на сайте cdstoolbox. Возможна ли вообще интерполяция по времени?

Всего наилучшего, R

Другие вопросы по тегам