U
    Cvf%                     @   s  d Z ddlmZ ddlZddlZddlmZm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZ dd	lmZ d
dhZddddddddddddddddddddd d!hZd"d#d$d%d&d'd(d)d*d+h
Zd,d- Zd.d/ Zd0d1 ZdDd3d4Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> ZdEd@dAZ dBdC Z!dS )Fz4Functions for converting to and from xarray objects
    )CounterN)CFDatetimeCoderCFTimedeltaCoder)	decode_cf)duck_array_ops)	DataArray)get_fill_value)
array_typenameZ	tileIndexstandard_name	long_nameunitsZboundsaxiscalendarZ
leap_monthZ	leap_yearZmonth_lengthsZcoordinatesZgrid_mappingZclimatologycell_methodsZformula_termscompressZmissing_valueZ
add_offsetZscale_factorZ	valid_maxZ	valid_minZvalid_rangeZ
_FillValueZpointsummaximumZmedianZ	mid_rangeZminimumZmeanmodeZstandard_deviationZvariancec                 C   s   t  t | jS N)r   encoder   variable)var r   2/tmp/pip-unpacked-wheel-h316xyqg/xarray/convert.pyr   6   s    r   c                    s    fdd|   D S )z*Return attrs that are not in ignored_attrsc                    s   i | ]\}}| kr||qS r   r   .0kvignored_attrsr   r   
<dictcomp><   s       z!_filter_attrs.<locals>.<dictcomp>items)attrsr    r   r   r   _filter_attrs:   s    r%   c           
      C   s   t | }| j}|  }i }|  D ]*}tt ||jgt|jtd||j< q$| 	 }|dk	rdd | D }|
 | fD ]<}|j|  krtt |dd |t|jtd||j< qt| jt}t|||||d}	t|	 |	j S )z*Convert a cdms2 variable into an DataArray)dimsr$   Nc                 S   s   g | ]
}|j qS r   id)r   ar   r   r   
<listcomp>M   s     zfrom_cdms2.<locals>.<listcomp>)r&   coordsr
   r$   )npZasarrayr(   
getAxisIdsgetAxisListr   r%   
attributescdms2_ignored_attrsZgetGridZgetLongitudeZgetLatituder   Z
to_datasetr
   )
r   valuesr
   r&   r+   r   Zgrididsr$   	dataarrayr   r   r   
from_cdms2?   s.    


r4   Tc                 C   s  ddl }dd }g }| jD ]8}t| j| }|j|j|d}|||j || qt| }|j|j|| j	t
|j|d}	||	|j | j	| jkri }
t| j t| j D ]R}| j|  }|jr|jjn|jj}||}| r||
d< q| r||
d< qd|
krd|
krt|
d jd	krF|j|
d |
d }n|j|
d |
d }| D ]}|	|	 |j | qd|	!| |	S )
z)Convert a DataArray into a cdms2 variabler   Nc                 S   s"   |  D ]\}}t| || qd S r   )r#   setattr)r   r$   r   r   r   r   r   set_cdms2_attrs_   s    z!to_cdms2.<locals>.set_cdms2_attrsr'   )axesr(   maskcopyZlonZlat   )"cdms2r&   r   r+   Z
createAxisr1   r$   appendZcreateVariabler
   pdZisnullsetkeysto_cdms2ndimcoordZTransientAxis2DZauxcoordZTransientAuxAxis1DZisLongitudeZ
isLatitudelenshapeZhgridZTransientCurveGridZgengridZAbstractGenericGridr.   ZsetAxisr-   indexr(   ZsetGrid)r3   r9   r;   r6   r7   ZdimrB   r   r   Z	cdms2_varZ
cdms2_axes
coord_nameZcoord_arrayZcdms2_axis_clsZ
cdms2_axisZ
cdms2_gridr   r   r   r@   Z   sX    
   
 


  
r@   c                    s    fdd|   D S )z#Return attrs with keys in keys listc                    s   i | ]\}}| kr||qS r   r   r   r?   r   r   r!      s       z_pick_attrs.<locals>.<dictcomp>r"   )r$   r?   r   rG   r   _pick_attrs   s    rH   c                 C   sR   ddl }dt| ti}|t| d t| d}d| krN|j| d f||d< |S )z@Converts the xarray attrs into args that can be passed into Irisr   Nr/   r   r   )r   r   )cf_unitsr%   iris_forbidden_keysupdaterH   ZUnit)r$   rJ   argsZ	unit_argsr   r   r   _get_iris_args   s    
rN   c              	   C   sF  ddl }ddlm} g }g }| jD ]}t| j| }t|j}||d< d}|jr\| |j}|| jkrz$|jj	|j
f|}	||	|f W q tk
r   |jj|j
f|}	||	|f Y qX q"|jj|j
f|}	||	|f q"t| j}
| j|
d< ||
d< ||
d< d| jkr&|| jd |
d< t| j}|jj|f|
}|S )z$Convert a DataArray into a Iris Cuber   N)parse_cell_methodsvar_nameZdim_coords_and_dimsZaux_coords_and_dimsr   )irisZiris.fileformats.netcdfrO   r+   r   rN   r$   r&   Zget_axis_numZDimCoordr1   r<   
ValueErrorZAuxCoordr
   r   Zmasked_invaliddatacubeZCube)r3   rQ   rO   
dim_coordsZ
aux_coordsrF   rB   Z
coord_argsr   Z
iris_coordrM   Zmasked_datarT   r   r   r   to_iris   s:    




rV   c                 C   sb   | j | jd}| jjr"| jj|d< | jjdkrD| j sD| jj|d< || j dd | D S )z5Return a dictionary of attrs when given a Iris objectrI   r   1r   c                 S   s   i | ]\}}|d k	r||qS r   r   r   r   r   r   r!      s       z&_iris_obj_to_attrs.<locals>.<dictcomp>)	r   r   r   r   originZ
is_unknownrL   r/   r#   )objr$   r   r   r   _iris_obj_to_attrs   s    rZ   c                 C   s   g }| D ]|}d dd |jD }d dd |jD }d dd |jD }d ||g }|rpd| d}|||j |  qd |S )	z*Converts a Iris cell methods into a string c                 s   s   | ]}| d V  qdS )z: Nr   )r   nr   r   r   	<genexpr>   s     z,_iris_cell_methods_to_str.<locals>.<genexpr> c                 s   s   | ]}d | V  qdS )z
interval: Nr   )r   intervalr   r   r   r]      s    c                 s   s   | ]}d | V  qdS )z	comment: Nr   )r   commentr   r   r   r]      s     z ())joinZcoord_names	intervalscommentsstripr<   method)Zcell_methods_objr   Zcell_methodnamesrc   rd   extrar   r   r   _iris_cell_methods_to_str   s    
ri   unknownc                 C   s   | j p| jp| jp|S )zMimics `iris_obj.name()` but with different name resolution order.

    Similar to iris_obj.name() method, but using iris_obj.var_name first to
    enable roundtripping.
    )rP   r   r   )Ziris_objdefaultr   r   r   _name   s    rl   c              	      s  ddl }t| }|dkrd}g  t| jD ]P}z"| jd|fd} t| W q* |jjk
rx    d|  Y q*X q*tt	 t krdd t
  D }td	| d
i }|  D ]X}t|} fdd| |D }	|	r|	|j|f|t|< qd|j |f|t|< qt| }
t| j}|r<||
d< t| drP|  n| j}td}t||rddlm} ||t| j}n*t|tjjrtj|t| j}n|}t ||||
 d}t!|" }|#|S )z%Convert a Iris cube into an DataArrayr   Nrj   T)rU   Z
dimensionsZdim_c                 S   s   g | ]\}}|d kr|qS )   r   r   r   r   r   r*     s      zfrom_iris.<locals>.<listcomp>zDuplicate coordinate name .c                    s   g | ]} | qS r   r   )r   ir&   r   r   r*     s     r   r   	core_dataZdask)ma)r+   r
   r$   r&   )$Ziris.exceptionsrl   rangerA   rB   r<   
exceptionsZCoordinateNotFoundErrorrC   r>   r   r#   rR   r+   rZ   
coord_dimsZpointsitemri   r   hasattrrq   rS   r	   
isinstanceZ
dask.arrayrr   Zfilledr   Zdtyper,   ZMaskedArrayr   r   Z_to_temp_datasetZ_from_temp_dataset)rT   rQ   r
   ro   Z	dim_coord
duplicatesr+   rB   Zcoord_attrsru   Zarray_attrsr   Z	cube_dataZdask_array_typeZdask_maZfilled_datar3   Z
decoded_dsr   rp   r   	from_iris   sT    
    rz   )T)rj   )"__doc__collectionsr   Znumpyr,   Zpandasr=   Zxarray.coding.timesr   r   Zxarray.conventionsr   Zxarray.corer   Zxarray.core.dataarrayr   Zxarray.core.dtypesr   Zxarray.core.pycompatr	   r0   rK   Zcell_methods_stringsr   r%   r4   r@   rH   rN   rV   rZ   ri   rl   rz   r   r   r   r   <module>   sn   
=(
	