
    d%                         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 Zd Zd ZddZd Zd Zd Zd Zd ZddZ d Z!dS )z4Functions for converting to and from xarray objects
    )CounterN)CFDatetimeCoderCFTimedeltaCoder)	decode_cf)duck_array_ops)	DataArray)get_fill_value)
array_typename	tileIndex>   axisunitsboundscalendarcompress	leap_year	long_name	valid_max	valid_min
_FillValue
add_offset
leap_monthclimatologycoordinatesvalid_rangecell_methodsgrid_mappingscale_factorformula_termsmissing_valuemonth_lengthsstandard_name>
   summeanmodepointmedianmaximumminimumvariance	mid_rangestandard_deviationc                     t                                          t                                          | j                            S N)r   encoder   variable)vars    .lib/python3.11/site-packages/xarray/convert.pyr/   r/   6   s2    $$_%6%6%=%=cl%K%KLLL    c                 D    fd|                                  D             S )z*Return attrs that are not in ignored_attrsc                 $    i | ]\  }}|v	||S  r6   ).0kvignored_attrss      r2   
<dictcomp>z!_filter_attrs.<locals>.<dictcomp><   s)    EEETQa}.D.DAq.D.D.Dr3   items)attrsr:   s    `r2   _filter_attrsr?   :   s%    EEEEU[[]]EEEEr3   c           	      f   t          j        |           }| j        }|                                 }i }|                                 D ]L}t          t          j        |          |j        gt          |j        t                              ||j        <   M| 	                                }|d |                                D             }|
                                |                                fD ]i}|j        |                                 vrLt          t          j        |dd                   |t          |j        t                              ||j        <   jt          | j        t                    }t          |||||          }	t          |	                                          |	j                 S )z*Convert a cdms2 variable into an DataArray)dimsr>   Nc                     g | ]	}|j         
S r6   id)r7   as     r2   
<listcomp>zfrom_cdms2.<locals>.<listcomp>M   s    000qt000r3   )rA   coordsr   r>   )npasarrayrD   
getAxisIdsgetAxisListr   r?   
attributescdms2_ignored_attrsgetGridgetLongitudegetLatituder   
to_datasetr   )
r0   valuesr   rA   rG   r   grididsr>   	dataarrays
             r2   
from_cdms2rV   ?   s   Z!!F;D  DF$$&& 
 
#Jt'1DEE
 
 
tw
 D00T--//000%%'')9)9););; 	 	Dwh113333"+JtAAAw'''9LMM# # #tw
 (-/BCCE&tFUSSSIY))++,,Y^<<r3   Tc                    ddl }d }g }| j        D ]^}t          | j        |                   }|                    |j        |          } |||j                   |                    |           _t          |           }|                    |j        || j	        t          j        |j                  |          }	 ||	|j                   | j	        | j        vri }
t          | j                                                  t          | j                  z
  D ]~}| j        |                                         }|j        r|j        j        n|j        j        } ||          }|                                r||
d<   e|                                r||
d<   d|
v rd|
v rt-          |
d         j                  dk    r(|j                            |
d         |
d                   }n'|j                            |
d         |
d                   }|                                D ]B}|	                    |	                                                    |j                   |           C|	!                    |           |	S )	z)Convert a DataArray into a cdms2 variabler   Nc                 \    |                                 D ]\  }}t          | ||           d S r.   )r=   setattr)r1   r>   r8   r9   s       r2   set_cdms2_attrsz!to_cdms2.<locals>.set_cdms2_attrs_   s<    KKMM 	 	DAqCA	 	r3   rC   )axesrD   maskcopylonlat   )"cdms2rA   r/   rG   
createAxisrR   r>   appendcreateVariabler   pdisnullsetkeysto_cdms2ndimcoordTransientAxis2DauxcoordTransientAuxAxis1DisLongitude
isLatitudelenshapehgridTransientCurveGridgengridAbstractGenericGridrK   setAxisrJ   indexrD   setGrid)rU   r]   ra   rZ   r[   dimrk   r   r1   	cdms2_var
cdms2_axes
coord_namecoord_arraycdms2_axis_cls
cdms2_axis
cdms2_grids                   r2   ri   ri   Z   s    LLL  
 D~  y',--55ek***D 

C$$
).ry7L7LSW %  I
 OIsy))) ~Y---
i.335566Y^9L9LL 	/ 	/J#*:6??AAK #7++^6 
 (44J%%'' /$.
5!!&&(( /$.
5!J5J#6#6:e$*++q00"[;;u%z%'8 

 #]>>u%z%'8 
 #..00 O O!!)"6"6"8"8">">tw"G"GNNNNj)))r3   c                 D    fd|                                  D             S )z#Return attrs with keys in keys listc                 $    i | ]\  }}|v 	||S r6   r6   )r7   r8   r9   rh   s      r2   r;   z_pick_attrs.<locals>.<dictcomp>   s$    888TQa4iiAqiiir3   r<   )r>   rh   s    `r2   _pick_attrsr      s%    8888U[[]]8888r3   c                     ddl }dt          | t                    i}|                    t	          | d                     t	          | d          }d| v r |j        | d         fi ||d<   |S )z@Converts the xarray attrs into args that can be passed into Irisr   NrL   r"   r   )r   r   )cf_unitsr?   iris_forbidden_keysupdater   Unit)r>   r   args	unit_argss       r2   _get_iris_argsr      s     OOO-/BCCDDKKE#ABBCCCE=11I%%eGnBB	BBWKr3   c                 "   ddl }ddlm} g }g }| j        D ]}t	          | j        |                   }t          |j                  }||d<   d}|j        r|                     |j                  }|| j        v rp	  |j        j	        |j
        fi |}	|                    |	|f           # t          $ r2  |j        j        |j
        fi |}	|                    |	|f           Y w xY w |j        j        |j
        fi |}	|                    |	|f           t          | j                  }
| j        |
d<   ||
d<   ||
d<   d| j        v r || j        d                   |
d<   t          j        | j                  } |j        j        |fi |
}|S )z$Convert a DataArray into a Iris Cuber   N)parse_cell_methodsvar_namedim_coords_and_dimsaux_coords_and_dimsr   )irisiris.fileformats.netcdfr   rG   r/   r   r>   rA   get_axis_numDimCoordrR   rc   
ValueErrorAuxCoordr   r   masked_invaliddatacubeCube)rU   r   r   
dim_coords
aux_coordsr}   rk   
coord_argsr   
iris_coordr   masked_datar   s                r2   to_irisr      s    KKK::::::JJ& 2 2
y'
344#EK00
!+
:: 	6))%*55D''61T[1%,MM*MM
!!:t"45555 6 6 61T[1%,MM*MM
!!:t"4555556 .-elIIjIIJz401111)/**D ~D",D	",D	((11)/.2QRR^ /	??K49>+....DKs   9/B))9C%$C%c                 6   | j         | j        d}| j        j        r| j        j        |d<   | j        j        dk    r(| j                                        s| j        j        |d<   |                    | j                   d |                                D             S )z5Return a dictionary of attrs when given a Iris objectr   r   1r   c                     i | ]
\  }}|||S r.   r6   r7   r8   r9   s      r2   r;   z&_iris_obj_to_attrs.<locals>.<dictcomp>   s    <<<TQamAqmmmr3   )	r"   r   r   r   origin
is_unknownr   rL   r=   )objr>   s     r2   _iris_obj_to_attrsr      s    !/cmLLE
y /I.j
y3sy';';'='=)g	LL   <<U[[]]<<<<r3   c                    g }| D ]}d                     d |j        D                       }d                     d |j        D                       }d                     d |j        D                       }d                     ||g                                          }|rd| d}|                    ||j        z   |z              d                     |          S )z*Converts a Iris cell methods into a string c              3       K   | ]	}| d V  
dS )z: Nr6   )r7   ns     r2   	<genexpr>z,_iris_cell_methods_to_str.<locals>.<genexpr>   s(      BBQ1BBBBBBr3    c              3       K   | ]	}d | V  
dS )z
interval: Nr6   )r7   intervals     r2   r   z,_iris_cell_methods_to_str.<locals>.<genexpr>   s<       
 
(0###
 
 
 
 
 
r3   c              3       K   | ]	}d | V  
dS )z	comment: Nr6   )r7   comments     r2   r   z,_iris_cell_methods_to_str.<locals>.<genexpr>   s+      VVg111VVVVVVr3   z ())joincoord_names	intervalscommentsstriprc   method)cell_methods_objr   cell_methodnamesr   r   extras          r2   _iris_cell_methods_to_strr      s    L' 	@ 	@BB+*ABBBBBHH 
 
4?4I
 
 
 
 
	 88VVAUVVVVV)X.//5577 	"!MMMEEK$66>????88L!!!r3   unknownc                 0    | 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.
    )r   r"   r   )iris_objdefaults     r2   _namer      s#     W 6W(:LWPWWr3   c                    ddl }t          |           }|dk    rd}g t          | j                  D ]j}	 |                     d|f          }                    t          |                     ># |j        j        $ r                     d|            Y gw xY wt          t                              t                    k    r>d t                                                    D             }t          d| d	          i }|                                 D ]{}t          |          }fd
|                     |          D             }	|	r|	|j        |f|t          |          <   Od|j                                        |f|t          |          <   |t          |           }
t%          | j                  }|r||
d<   t)          | d          r|                                 n| j        }t/          d          }t1          ||          r/ddlm} |                    |t9          | j                            }nTt1          |t<          j        j                  r3t<          j                            |t9          | j                            }n|}tA          ||||
          }tC          |"                                          }|#                    |          S )z%Convert a Iris cube into an DataArrayr   Nr   T)r   
dimensionsdim_c                 $    g | ]\  }}|d k    |S )   r6   r   s      r2   rF   zfrom_iris.<locals>.<listcomp>  s!    CCCDAqQUUaUUUr3   zDuplicate coordinate name .c                      g | ]
}|         S r6   r6   )r7   irA   s     r2   rF   zfrom_iris.<locals>.<listcomp>  s    >>>!d1g>>>r3   r6   r   	core_datadask)ma)rG   r   r>   rA   )$iris.exceptionsr   rangerj   rk   rc   
exceptionsCoordinateNotFoundErrorrq   rg   r   r=   r   rG   r   
coord_dimspointsitemr   r   hasattrr   r   r
   
isinstance
dask.arrayr   filledr	   dtyperH   MaskedArrayr   r   _to_temp_dataset_from_temp_dataset)r   r   r   r   	dim_coord
duplicatesrG   rk   coord_attrsr   array_attrsr   	cube_datadask_array_typedask_mafilled_datarU   
decoded_dsrA   s                     @r2   	from_irisr      s   ;;DyD49 $ $	$

dt
DDIKKi(())))6 	$ 	$ 	$KK
q

#####	$ 3t99~~T""CCGDMM$7$7$9$9CCC
CjCCCDDDF J J(//>>>>tu'='=>>>
 	J$.k#JF5<<  $&(9(9(;(;[#IF5<<  $T**K,T->??L 3&2N# %,D+$>$>M   DII !((O)_--  ,,,,,,nnYtz0J0JKK	Iru0	1	1  ell9nTZ.H.HIIF[t  I 9557788J''
333s   :A11'BB)T)r   )"__doc__collectionsr   numpyrH   pandasre   xarray.coding.timesr   r   xarray.conventionsr   xarray.corer   xarray.core.dataarrayr   xarray.core.dtypesr	   xarray.core.pycompatr
   rM   r   cell_methods_stringsr/   r?   rV   ri   r   r   r   r   r   r   r   r6   r3   r2   <module>r      s                  A A A A A A A A ( ( ( ( ( ( & & & & & & + + + + + + - - - - - - + + + + + +{+    0   M M MF F F
= = =68 8 8 8v9 9 9

 
 
% % %P= = =" " " X X X X44 44 44 44 44r3   