oafuncs 0.0.98.21__py3-none-any.whl → 0.0.98.22__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -82,8 +82,8 @@ def merge_nc(file_list: Union[str, List[str]], var_name: Optional[Union[str, Lis
82
82
 
83
83
  for var in pbar(merged_data, "Merging variables"):
84
84
  if isinstance(merged_data[var], list):
85
- # 使用compat='override'确保合并时属性不会冲突
86
- merged_data[var] = xr.concat(merged_data[var], dim=dim_name, compat="override")
85
+ # 使用 coords='minimal' 替代默认值,并移除可能冲突的 compat='override'
86
+ merged_data[var] = xr.concat(merged_data[var], dim=dim_name, coords="minimal")
87
87
  # 恢复原始填充值和缺失值属性
88
88
  if var in fill_values:
89
89
  merged_data[var].attrs["_FillValue"] = fill_values[var]
@@ -100,19 +100,29 @@ def merge_nc(file_list: Union[str, List[str]], var_name: Optional[Union[str, Lis
100
100
  if coord not in merged_ds.coords:
101
101
  merged_ds = merged_ds.assign_coords({coord: ds0[coord]})
102
102
 
103
- # 如果合并维度是坐标,检查所有文件的该坐标是否一致
103
+ """ # 修改合并维度验证逻辑,更合理地检查所有文件维度的兼容性
104
104
  if dim_name in merged_ds.coords and len(file_list) > 1:
105
- logging.info(f"验证合并维度 {dim_name} 的一致性...")
106
- for file in file_list[1:]:
105
+ logging.info(f"检查合并维度 {dim_name} 的有效性...")
106
+
107
+ # 收集所有文件的该维度值
108
+ all_dim_values = []
109
+ for file in file_list:
107
110
  with xr.open_dataset(file) as ds:
108
- if dim_name in ds.coords and not ds[dim_name].equals(merged_ds[dim_name]):
109
- logging.warning(f"文件 {file} 的 {dim_name} 坐标与合并后的数据不一致,可能导致数据失真")
111
+ if dim_name in ds.coords:
112
+ all_dim_values.append(ds[dim_name].values)
113
+
114
+ # 只有当有两个或更多不同值集合时才警告
115
+ unique_values_count = len({tuple(vals.tolist()) if hasattr(vals, "tolist") else tuple(vals) for vals in all_dim_values})
116
+ if unique_values_count > 1:
117
+ logging.warning(f"检测到 {unique_values_count} 种不同的 {dim_name} 坐标值集合,合并可能导致数据重新排列")
118
+ else:
119
+ logging.info(f"所有文件的 {dim_name} 坐标值完全一致,合并将保持原始顺序") """
110
120
 
111
121
  if os.path.exists(target_filename):
112
122
  logging.warning("The target file already exists. Removing it ...")
113
123
  os.remove(target_filename)
114
124
 
115
- merged_ds.to_netcdf(target_filename,mode='w')
125
+ merged_ds.to_netcdf(target_filename, mode="w")
116
126
 
117
127
 
118
128
  # Example usage
oafuncs/oa_cmap.py CHANGED
@@ -8,7 +8,9 @@ __all__ = ["show", "to_color", "create", "get"]
8
8
 
9
9
 
10
10
  # ** 将cmap用填色图可视化(官网摘抄函数)
11
- def show(colormaps: Union[str, mpl.colors.Colormap, List[Union[str, mpl.colors.Colormap]]]) -> None:
11
+ def show(
12
+ colormaps: Union[str, mpl.colors.Colormap, List[Union[str, mpl.colors.Colormap]]],
13
+ ) -> None:
12
14
  """Helper function to plot data with associated colormap.
13
15
 
14
16
  This function creates a visualization of one or more colormaps by applying them
@@ -97,7 +99,14 @@ def to_color(colormap_name: str, num_colors: int = 256) -> List[tuple]:
97
99
 
98
100
 
99
101
  # ** 自制cmap,多色,可带位置
100
- def create(color_list: Optional[List[Union[str, tuple]]] = None, rgb_file: Optional[str] = None, color_positions: Optional[List[float]] = None, below_range_color: Optional[Union[str, tuple]] = None, above_range_color: Optional[Union[str, tuple]] = None, value_delimiter: str = ",") -> mpl.colors.Colormap:
102
+ def create(
103
+ color_list: Optional[List[Union[str, tuple]]] = None,
104
+ rgb_file: Optional[str] = None,
105
+ color_positions: Optional[List[float]] = None,
106
+ below_range_color: Optional[Union[str, tuple]] = None,
107
+ above_range_color: Optional[Union[str, tuple]] = None,
108
+ value_delimiter: str = ",",
109
+ ) -> mpl.colors.Colormap:
101
110
  """Create a custom colormap from a list of colors or an RGB txt document.
102
111
 
103
112
  Args:
@@ -144,7 +153,7 @@ def create(color_list: Optional[List[Union[str, tuple]]] = None, rgb_file: Optio
144
153
 
145
154
  if rgb_file:
146
155
  try:
147
- print(f"Reading RGB data from {rgb_file}...")
156
+ # print(f"Reading RGB data from {rgb_file}...")
148
157
 
149
158
  with open(rgb_file) as fid:
150
159
  data = [line.strip() for line in fid if line.strip() and not line.strip().startswith("#")]
@@ -178,7 +187,7 @@ def create(color_list: Optional[List[Union[str, tuple]]] = None, rgb_file: Optio
178
187
  if max_rgb > 2:
179
188
  rgb = rgb / 255.0
180
189
  cmap_color = mpl.colors.ListedColormap(rgb, name="my_color")
181
- print(f"Successfully created colormap from {rgb_file}")
190
+ # print(f"Successfully created colormap from {rgb_file}")
182
191
  except FileNotFoundError:
183
192
  error_msg = f"RGB file not found: {rgb_file}"
184
193
  print(error_msg)
@@ -189,15 +198,15 @@ def create(color_list: Optional[List[Union[str, tuple]]] = None, rgb_file: Optio
189
198
  cmap_color = mpl.colors.LinearSegmentedColormap.from_list("mycmap", color_list)
190
199
  else:
191
200
  cmap_color = mpl.colors.LinearSegmentedColormap.from_list("mycmap", list(zip(color_positions, color_list)))
192
- print(f"Successfully created colormap from {len(color_list)} colors")
201
+ # print(f"Successfully created colormap from {len(color_list)} colors")
193
202
 
194
203
  # Set below/above range colors if provided
195
204
  if below_range_color is not None:
196
205
  cmap_color.set_under(below_range_color)
197
- print(f"Set below-range color to {below_range_color}")
206
+ # print(f"Set below-range color to {below_range_color}")
198
207
  if above_range_color is not None:
199
208
  cmap_color.set_over(above_range_color)
200
- print(f"Set above-range color to {above_range_color}")
209
+ # print(f"Set above-range color to {above_range_color}")
201
210
 
202
211
  return cmap_color
203
212
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oafuncs
3
- Version: 0.0.98.21
3
+ Version: 0.0.98.22
4
4
  Summary: Oceanic and Atmospheric Functions
5
5
  Home-page: https://github.com/Industry-Pays/OAFuncs
6
6
  Author: Kun Liu
@@ -1,5 +1,5 @@
1
1
  oafuncs/__init__.py,sha256=T_-VtnWWllV3Q91twT5Yt2sUapeA051QbPNnBxmg9nw,1456
2
- oafuncs/oa_cmap.py,sha256=NVKwEkmMUKXh9L1svx_WHqemLOx3evgX3_-UVDxc9ko,11498
2
+ oafuncs/oa_cmap.py,sha256=pUFAGzbIg0WLxObBP2t_--ZIg00Dxdojx0y7OjTeqEo,11551
3
3
  oafuncs/oa_data.py,sha256=Aat9ktxxRGevaqQya3IJWfXeoEs-FCXGUcNE2pKnzfU,10931
4
4
  oafuncs/oa_date.py,sha256=WhM6cyD4G3IeghjLTHhAMtlvJbA7kwQG2sHnxdTgyso,6303
5
5
  oafuncs/oa_draw.py,sha256=IaBGDx-EOxyMM2IuJ4zLZt6ruHHV5qFStPItmUOXoWk,17635
@@ -14,7 +14,7 @@ oafuncs/_script/cprogressbar.py,sha256=UIgGcLFs-6IgWlITuBLaQqrpt4OAK3Mst5RlCiNfZ
14
14
  oafuncs/_script/data_interp.py,sha256=EiZbt6n5BEaRKcng88UgX7TFPhKE6TLVZniS01awXjg,5146
15
15
  oafuncs/_script/data_interp_geo.py,sha256=ZRFb3fKRiYQViZNHd19eW20C9i38BsiIU8w0fG5mbqM,7789
16
16
  oafuncs/_script/email.py,sha256=lL4HGKrr524-g0xLlgs-4u7x4-u7DtgNoD9AL8XJKj4,3058
17
- oafuncs/_script/netcdf_merge.py,sha256=4mZLMcxBL4Rehi_eW2EX6vqbMJgZBOL4_ceaMzcuzio,5565
17
+ oafuncs/_script/netcdf_merge.py,sha256=tM9ePqLiEsE7eIsNM5XjEYeXwxjYOdNz5ejnEuI7xKw,6066
18
18
  oafuncs/_script/netcdf_modify.py,sha256=sGRUYNhfGgf9JV70rnBzw3bzuTRSXzBTL_RMDnDPeLQ,4552
19
19
  oafuncs/_script/netcdf_write.py,sha256=GvyUyUhzMonzSp3y4pT8ZAfbQrsh5J3dLnmINYJKhuE,21422
20
20
  oafuncs/_script/parallel.py,sha256=07-BJVHxXJNlrOrhrSGt7qCZiKWq6dBvNDBA1AANYnI,8861
@@ -39,8 +39,8 @@ oafuncs/oa_sign/__init__.py,sha256=QKqTFrJDFK40C5uvk48GlRRbGFzO40rgkYwu6dYxatM,5
39
39
  oafuncs/oa_sign/meteorological.py,sha256=8091SHo2L8kl4dCFmmSH5NGVHDku5i5lSiLEG5DLnOQ,6489
40
40
  oafuncs/oa_sign/ocean.py,sha256=xrW-rWD7xBWsB5PuCyEwQ1Q_RDKq2KCLz-LOONHgldU,5932
41
41
  oafuncs/oa_sign/scientific.py,sha256=a4JxOBgm9vzNZKpJ_GQIQf7cokkraV5nh23HGbmTYKw,5064
42
- oafuncs-0.0.98.21.dist-info/licenses/LICENSE.txt,sha256=rMtLpVg8sKiSlwClfR9w_Dd_5WubTQgoOzE2PDFxzs4,1074
43
- oafuncs-0.0.98.21.dist-info/METADATA,sha256=Lk9y2XVdDKb9HB5PP_Pm-_aII0tnGmaladuGW1Y9otM,4273
44
- oafuncs-0.0.98.21.dist-info/WHEEL,sha256=ooBFpIzZCPdw3uqIQsOo4qqbA4ZRPxHnOH7peeONza0,91
45
- oafuncs-0.0.98.21.dist-info/top_level.txt,sha256=bgC35QkXbN4EmPHEveg_xGIZ5i9NNPYWqtJqaKqTPsQ,8
46
- oafuncs-0.0.98.21.dist-info/RECORD,,
42
+ oafuncs-0.0.98.22.dist-info/licenses/LICENSE.txt,sha256=rMtLpVg8sKiSlwClfR9w_Dd_5WubTQgoOzE2PDFxzs4,1074
43
+ oafuncs-0.0.98.22.dist-info/METADATA,sha256=ctJ9aAoY3RztAP6gD2STCFB0ZZaCbXQV8SufCLMGkbM,4273
44
+ oafuncs-0.0.98.22.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
45
+ oafuncs-0.0.98.22.dist-info/top_level.txt,sha256=bgC35QkXbN4EmPHEveg_xGIZ5i9NNPYWqtJqaKqTPsQ,8
46
+ oafuncs-0.0.98.22.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.0.1)
2
+ Generator: setuptools (80.3.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5