a
    İa%                     @   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h dZh dZdd Zdd Zdd Zd'ddZdd Zdd Zdd Zdd Zd d! Zd(d#d$Z d%d& Z!dS ))z4Functions for converting to and from xarray objects
    )CounterN   )CFDatetimeCoderCFTimedeltaCoder)	decode_cf)duck_array_ops)	DataArray)get_fill_value)dask_array_typenameZ	tileIndex>   Zgrid_mappingZ
_FillValueZmissing_valueZ	valid_maxZboundsZ	valid_minunitsZformula_termsZ
leap_monthZ
add_offsetZvalid_rangeZmonth_lengthsZ	leap_yearcompressZclimatologyZcoordinates	long_namecell_methodsZscale_factorstandard_namecalendaraxis>
   ZmediansumZmaximumZ	mid_rangeZvariancemodeZmeanZminimumZstandard_deviationZpointc                 C   s   t  t | jS N)r   encoder   variable)var r   -lib/python3.9/site-packages/xarray/convert.pyr   6   s    r   c                    s    fdd|   D S )z*Return attrs that are not in ignored_attrsc                    s   i | ]\}}| vr||qS r   r   .0kvignored_attrsr   r   
<dictcomp><       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urdd | D }|
 | fD ]<}|j|  v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   r"   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gridZ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vri }
t| j t| j D ]R}| j|  }|jr|jjn|jj}||}| r||
d< q| r||
d< qd|
v rd|
v 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
createAxisr2   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   sL    




r@   c                    s    fdd|   D S )z#Return attrs with keys in keys listc                    s   i | ]\}}| v r||qS r   r   r   r?   r   r   r!      r"   z_pick_attrs.<locals>.<dictcomp>r#   )r%   r?   r   rG   r   _pick_attrs   s    rH   c                 C   sV   ddl }dt| ti}|t| d t| d}d| v rR|j| d fi ||d< |S )z@Converts the xarray attrs into args that can be passed into Irisr   Nr0   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   sT  ddl }ddlm} g }g }| jD ]}t| j| }t|j}||d< d}|jr\| |j}|| jv rz(|jj	|j
fi |}	||	|f W q ty   |jj|j
fi |}	||	|f Y q0 q"|jj|j
fi |}	||	|f q"t| j}
| j|
d< ||
d< ||
d< d| jv r0|| jd |
d< t| j}|jj|fi |
}|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DimCoordr2   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 ur||qS r   r   r   r   r   r   r!      r"   z&_iris_obj_to_attrs.<locals>.<dictcomp>)	r   r   r   r   originZ
is_unknownrL   r0   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>   r"   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   Zcommentr   r   r   r]      r"   z ())joinZcoord_names	intervalscommentsstripr<   method)Zcell_methods_objr   Zcell_methodnamesrb   rc   Zextrar   r   r   _iris_cell_methods_to_str   s    
rg   unknownc                 C   s   | j p| jp| jp|S )zMimicks `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    rj   c              	      s  ddl }t| }|dkrd}g  t| jD ]N}z"| jd|fd} t| W q* |jjyv    d|  Y q*0 q*tt	 t krdd t
  D }td	| d
i }|  D ]V}t|} fdd| |D }	|	r|	|j|f|t|< qd|j |f|t|< qt| }
t| j}|r8||
d< t| drL|  n| j}t|tr~d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   Nrh   T)rU   Z
dimensionsZdim_c                 S   s   g | ]\}}|d kr|qS )r   r   r   r   r   r   r+     r"   zfrom_iris.<locals>.<listcomp>zDuplicate coordinate name .c                    s   g | ]} | qS r   r   )r   ir'   r   r   r+     r"   r   r   	core_data)ma)r,   r   r%   r'   )$Ziris.exceptionsrj   rangerA   rB   r<   
exceptionsZCoordinateNotFoundErrorrC   r>   r   r$   rR   r,   rZ   
coord_dimsZpointsitemrg   r   hasattrrn   rS   
isinstancer
   Z
dask.arrayro   Zfilledr	   Zdtyper-   ZMaskedArrayr   r   Z_to_temp_datasetZ_from_temp_dataset)rT   rQ   r   rl   Z	dim_coord
duplicatesr,   rB   Zcoord_attrsrr   Zarray_attrsr   Z	cube_dataZdask_maZfilled_datar3   Z
decoded_dsr   rm   r   	from_iris   sJ    

rw   )T)rh   )"__doc__collectionsr   Znumpyr-   Zpandasr=   Zcoding.timesr   r   Zconventionsr   corer   Zcore.dataarrayr   Zcore.dtypesr	   Zcore.pycompatr
   r1   rK   Zcell_methods_stringsr   r&   r4   r@   rH   rN   rV   rZ   rg   rj   rw   r   r   r   r   <module>   s.   
=(
	