|
22 | 22 | from urllib.parse import urlparse |
23 | 23 |
|
24 | 24 | import cfgrib |
25 | | -import numpy as np |
26 | 25 | import pandas as pd |
27 | 26 | import requests |
28 | 27 | import xarray as xr |
|
52 | 51 | "Curl is not in system Path. Herbie won't be able to download GRIB files." |
53 | 52 | ) |
54 | 53 |
|
55 | | - |
56 | | -_INT32_MIN = np.iinfo(np.int32).min |
57 | | -_INT32_MAX = np.iinfo(np.int32).max |
58 | | - |
59 | | - |
60 | | -def _sanitize_attr_value(value): |
61 | | - """Convert attribute values so they are compatible with NetCDF3 writers.""" |
62 | | - |
63 | | - if isinstance(value, np.integer): |
64 | | - value = int(value) |
65 | | - if value < _INT32_MIN or value > _INT32_MAX: |
66 | | - return float(value) |
67 | | - return value |
68 | | - if isinstance(value, np.floating): |
69 | | - return float(value) |
70 | | - if isinstance(value, np.ndarray): |
71 | | - return [_sanitize_attr_value(v) for v in value.tolist()] |
72 | | - if isinstance(value, list): |
73 | | - return [_sanitize_attr_value(v) for v in value] |
74 | | - if isinstance(value, tuple): |
75 | | - return tuple(_sanitize_attr_value(v) for v in value) |
76 | | - if isinstance(value, (np.datetime64, np.timedelta64)): |
77 | | - if np.isnat(value): |
78 | | - return None |
79 | | - return value.item() if hasattr(value, "item") else value |
80 | | - return value |
81 | | - |
82 | | - |
83 | | -def _sanitize_attrs(obj): |
84 | | - """Ensure attributes are serialisable by NetCDF writers.""" |
85 | | - |
86 | | - obj.attrs = {k: _sanitize_attr_value(v) for k, v in obj.attrs.items()} |
87 | | - |
88 | | - |
89 | | -def _sanitize_variable(obj): |
90 | | - """Sanitize both attributes and encoding for an xarray Variable.""" |
91 | | - |
92 | | - _sanitize_attrs(obj) |
93 | | - |
94 | | - if not hasattr(obj, "dtype"): |
95 | | - return |
96 | | - |
97 | | - dtype = obj.dtype |
98 | | - if dtype is None: |
99 | | - return |
100 | | - |
101 | | - if np.issubdtype(dtype, np.datetime64) or np.issubdtype(dtype, np.timedelta64): |
102 | | - obj.attrs.pop("_FillValue", None) |
103 | | - if hasattr(obj, "encoding"): |
104 | | - obj.encoding["_FillValue"] = None |
105 | | - |
106 | | - |
107 | 54 | def wgrib2_idx(grib2filepath: Union[Path, str]) -> str: |
108 | 55 | """ |
109 | 56 | Produce the GRIB2 inventory index with wgrib2. |
|
0 commit comments