Как обрабатывать временные переменные файлов OCO-2 / Tropomi NETCDF4 с помощью Xarray?

Я работаю над файлами Tropomi .nc. Когда я открываю набор данных с помощью xarray, он не обрабатывает измерение времени. В файлах Tropomi измерение времени называется sounding_dim. Вместо того, чтобы расшифровывать время, возвращаемый результат - это просто звучащее число.

Я также пробовал файлы OCO-2 .nc. В OCO-2 измерением времени является «sounding_id». В случае OCO-2 время возвращается как плавающее число, а не как дата. Код и результат выдаются следующим образом:

import numpy as np
import xarray as xr
from datetime import datetime as dt
import pandas as pd 

tropomi = xr.open_dataset('/Users/farhanmustafa/Documents/analysis/tropomi/ESACCI-GHG-L2-CH4-CO-TROPOMI-WFMD-20190102-fv1.nc', engine = 'netcdf4')
tropomi

Возвращаемый результат:

<xarray.Dataset>
Dimensions:                 (corners_dim: 4, layer_dim: 20, level_dim: 21, sounding_dim: 374749)
Dimensions without coordinates: corners_dim, layer_dim, level_dim, sounding_dim
Data variables:
    time                    (sounding_dim) datetime64[ns] ...
    latitude                (sounding_dim) float32 ...
    longitude               (sounding_dim) float32 ...
    solar_zenith_angle      (sounding_dim) float32 ...
    sensor_zenith_angle     (sounding_dim) float32 ...
    azimuth_difference      (sounding_dim) float32 ...
    xch4                    (sounding_dim) float32 ...
    xch4_uncertainty        (sounding_dim) float32 ...
    xco                     (sounding_dim) float32 ...
    xco_uncertainty         (sounding_dim) float32 ...
    quality_flag            (sounding_dim) int32 ...
    pressure_levels         (sounding_dim, level_dim) float32 ...
    pressure_weight         (sounding_dim, layer_dim) float32 ...
    ch4_profile_apriori     (sounding_dim, layer_dim) float32 ...
    xch4_averaging_kernel   (sounding_dim, layer_dim) float32 ...
    co_profile_apriori      (sounding_dim, layer_dim) float32 ...
    xco_averaging_kernel    (sounding_dim, layer_dim) float32 ...
    orbit_number            (sounding_dim) int32 ...
    scanline                (sounding_dim) int32 ...
    ground_pixel            (sounding_dim) int32 ...
    latitude_corners        (sounding_dim, corners_dim) float32 ...
    longitude_corners       (sounding_dim, corners_dim) float32 ...
    altitude                (sounding_dim) float32 ...
    apparent_albedo         (sounding_dim) float32 ...
    land_fraction           (sounding_dim) int32 ...
    cloud_parameter         (sounding_dim) float32 ...
    h2o_column              (sounding_dim) float32 ...
    h2o_column_uncertainty  (sounding_dim) float32 ...
Attributes:
    title:                     TROPOMI/WFMD XCH4 and XCO
    institution:               University of Bremen
    source:                    TROPOMI L1B version 01.00.00
    history:                   2019 - product generated with WFMD
    tracking_id:               41f8bb71-4f43-4927-843a-4f02ed013f3b
    Conventions:               CF-1.6
    product_version:           v1.2
    summary:                   Weighting Function Modified DOAS (WFMD) was ad...
    keywords:                  satellite, Sentinel-5 Precursor, TROPOMI, atmo...
    id:                        ESACCI-GHG-L2-CH4-CO-TROPOMI-WFMD-20190102-fv1.nc
    naming_authority:          iup.uni-bremen.de
    keywords_vocabulary:       NASA Global Change Master Directory (GCMD)
    cdm_data_type:             point
    comment:                   These data were produced at the University of ...
    date_created:              20200322T232210Z
    creator_name:              University of Bremen, IUP, Oliver Schneising
    creator_email:             [email protected]
    project:                   Climate Change Initiative - European Space Agency
    geospatial_lat_min:        -90
    geospatial_lat_max:        90
    geospatial_lat_units:      degree_north
    geospatial_lon_min:        -180
    geospatial_lon_max:        180
    geospatial_lon_units:      degree_east
    geospatial_vertical_min:   0
    geospatial_vertical_max:   100000
    time_coverage_start:       20190102T000000Z
    time_coverage_end:         20190102T235959Z
    time_coverage_duration:    P1D
    time_coverage_resolution:  P1D
    standard_name_vocabulary:  NetCDF Climate and Forecast (CF) Metadata Conv...
    license:                   ESA CCI Data Policy: free and open access
    platform:                  Sentinel-5 Precursor
    sensor:                    TROPOMI
    spatial_resolution:        7km x 7km at nadir (typically)

Когда я пытаюсь получить измерение времени:

tropomi.sounding_dim

<xarray.DataArray 'sounding_dim' (sounding_dim: 374749)>
array([     0,      1,      2, ..., 374746, 374747, 374748])
Dimensions without coordinates: sounding_dim

tropomi['sounding_dim'] = dt.strptime(tropomi["sounding_dim"], "%Y%m%d%H%M%S")

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-18-a749e221323c> in <module>
----> 1 tropomi['sounding_dim'] = dt.strptime(tropomi["sounding_dim"], "%Y%m%d%H%M%S")

TypeError: strptime() argument 1 must be str, not DataArray

Я перепробовал все решения, которые смог найти в Интернете. Буду благодарен, если кто-нибудь поможет мне разобраться. Хочу отметить, что я уже успешно обработал файлы GEOS-CHEM .nc и не сталкивался с подобными ошибками.


person Farhan Mustafa    schedule 08.10.2020    source источник


Ответы (1)


Похоже, у вас есть переменная time с типом np.datetime64. Вы можете использовать ds.swap_dims({"sounding_dim": "time"}), чтобы сделать time координатной переменной. См. https://xarray.pydata.org/en/stable/generated/xarray.Dataset.swap_dims.html

person dcherian    schedule 08.10.2020
comment
Большое спасибо, у меня это сработало. У меня просто вопрос в голове, в Matlab я обработал те же данные, используя sounding_dim в качестве измерения времени. Будут ли данные такими же после вашей процедуры. Еще раз спасибо - person Farhan Mustafa; 09.10.2020