2017-08-03 6 views
1

J'ai une mauvaise compréhension des variables de temps dans xarray. J'ai un fichier netcdf4 avec le temps à la fois la dimension illimitée et une variable (par exemple coordonnée variable) définie ainsi:python xarray perd l'attribut units pour la variable de temps

double time(time=59231); 
    :_Netcdf4Dimid = 0; // int 
    :units = "seconds since 2015-11-12 16:1:48.500000 0:00"; 

Il est également temps de convention EPIC stockées dans le fichier (parce que je vais toujours revenir en arrière ici entre les conventions code de test)

int EPIC_time(time=59231); 
    :units = "True Julian Day"; 
    :epic_code = 624; // int 
    :datum = "Time (UTC) in True Julian Days: 2440000 = 0000 h on May 23, 1968"; 
    :NOTE = "Decimal Julian day [days] = time [days] + (time2 [msec]/86400000 [msec/day])"; 
    :_Netcdf4Dimid = 0; // int 
    :serial_number = "23881"; 
    :sensor_type = "TRDI"; 
    :sensor_depth = 10.367607116699219; // double 
    :initial_sensor_height = 1; // int 
    :initial_sensor_height_note = "height in meters above bottom: accurate for tripod mounted instruments"; 
    :height_depth_units = "m"; 
    :_FillValue = -1; // int 
    :_Unsigned = "true"; 

et il y a une variable avec l'instrument tête là aussi:

float Hdg_1215(time=59231, lat=1, lon=1); 
    :_FillValue = 1.0E35f; // float 
    :units = "degrees"; 
    :name = "Hdg"; 

Pour ouvrir le fichier et de travailler avec elle, je fais cela:

import xarray as xr 
import numpy as np 
import datetime as dt 
vars2omit = {'EPIC_time','EPIC_time2'} 
ds = xr.open_dataset(infile,decode_times=True,drop_variables=vars2omit) 

Je peux tracer et faire des choses avec les données. Il y a deux comportements très étranges, dont l'explication m'aidera à comprendre le fonctionnement interne de xarray.

Une fois le fichier ouvert, tenter d'accéder à l'attribut units pour la variable de temps (variable de temps de coordonnées) échoue. Pourquoi? L'attribut est dans le fichier.

print(ds['Hdg_1215'].attrs['units']) # this works 
print(ds['time'].attrs['units']) # this fails, KeyError: 'units' 

Répondre

1

xarray décode automatiquement une variable de temps, il comprend dans une coordonnée de variable objet datetime64, afin d'avoir units serait inapproprié.

Si vous le dites decode_times=False, il ne crée pas l'objet datetime64 et vous laisse avec un simple tableau de nombres, pour lesquels units sont nécessaires pour interpréter les valeurs.

Voici un exemple:

import xarray as xr 
url ='http://geoport.whoi.edu/thredds/dodsC/usgs/data2/emontgomery/stellwagen/CF-1.6/ARGO_MERCHANT/1211P-A.cdf' 
xr.open_dataset(url) 

produit:

<xarray.Dataset> 
Dimensions:    (time: 10748) 
Coordinates: 
    latitude    float32 ... 
    longitude    float32 ... 
    * time     (time) datetime64[ns] 1977-01-08T11:33:44 ... 
    z      float64 ... 
Data variables: 
    feature_type_instance |S64 ... 
    crs     int32 ... 
... 

tout

xr.open_dataset(url, decode_times=False) 

produit:

<xarray.Dataset> 
Dimensions:    (time: 10748) 
Coordinates: 
    latitude    float32 ... 
    longitude    float32 ... 
    * time     (time) float64 2.216e+08 2.216e+08 2.216e+08 ... 
    z      float64 ... 
Data variables: 
    feature_type_instance |S64 ... 
    crs     int32 ...