nctoolkit 1.2.0__tar.gz → 1.2.2__tar.gz

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.
Files changed (97) hide show
  1. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/PKG-INFO +15 -2
  2. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/runthis.py +14 -8
  3. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/static_plot.py +1 -0
  4. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/subset.py +6 -0
  5. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/verticals.py +20 -8
  6. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/setup.py +1 -1
  7. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/CITATION.cff +0 -0
  8. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/CODE_OF_CONDUCT.md +0 -0
  9. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/CONTRIBUTIONS.md +0 -0
  10. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/LICENSE +0 -0
  11. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/MANIFEST.in +0 -0
  12. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/README.md +0 -0
  13. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/benchmarks/benchmark_nctoolkit_versus_xarray.ipynb +0 -0
  14. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/cheatsheet/nctoolkit_cheatsheet.pdf +0 -0
  15. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/cheatsheet/nctoolkit_cheatsheet.pptx +0 -0
  16. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/checklists/api_checker.ipynb +0 -0
  17. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/data/geotiff.tif +0 -0
  18. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/data/pubplot_test.png +0 -0
  19. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/data/test1.html +0 -0
  20. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/data/test2.html +0 -0
  21. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/__init__.py +0 -0
  22. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/add_etc.py +0 -0
  23. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/anomaly.py +0 -0
  24. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/api.py +0 -0
  25. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/append.py +0 -0
  26. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/assign.py +0 -0
  27. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/cdo_command.py +0 -0
  28. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/cellareas.py +0 -0
  29. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/centres.py +0 -0
  30. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/checks.py +0 -0
  31. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/cleanup.py +0 -0
  32. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/clear.py +0 -0
  33. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/compare.py +0 -0
  34. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/compare_data.py +0 -0
  35. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/corr.py +0 -0
  36. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/create_ensemble.py +0 -0
  37. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/crop.py +0 -0
  38. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/deprecated.py +0 -0
  39. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/distgrid.py +0 -0
  40. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/drop.py +0 -0
  41. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/ensembles.py +0 -0
  42. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/esoteric.py +0 -0
  43. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/experimental.py +0 -0
  44. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/fill.py +0 -0
  45. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/flatten.py +0 -0
  46. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/fldstat.py +0 -0
  47. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/format.py +0 -0
  48. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/generate_grid.py +0 -0
  49. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/inttime.py +0 -0
  50. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/invert.py +0 -0
  51. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/masking.py +0 -0
  52. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/matchpoint.py +0 -0
  53. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/mergers.py +0 -0
  54. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/meridonials.py +0 -0
  55. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/mp_adders.py +0 -0
  56. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/mp_matchers.py +0 -0
  57. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/mp_matchups.py +0 -0
  58. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/nco_command.py +0 -0
  59. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/phenology.py +0 -0
  60. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/plot.py +0 -0
  61. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/reduce.py +0 -0
  62. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/reduce_grid.py +0 -0
  63. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/regrid.py +0 -0
  64. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/remove.py +0 -0
  65. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/rename.py +0 -0
  66. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/resample.py +0 -0
  67. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/rollstat.py +0 -0
  68. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/run.py +0 -0
  69. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/runners.py +0 -0
  70. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/session.py +0 -0
  71. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/set.py +0 -0
  72. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/setters.py +0 -0
  73. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/shape.py +0 -0
  74. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/shift.py +0 -0
  75. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/show.py +0 -0
  76. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/split.py +0 -0
  77. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/strip_vars.py +0 -0
  78. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/sumall.py +0 -0
  79. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/temp_file.py +0 -0
  80. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/temporal_stat.py +0 -0
  81. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/temporals.py +0 -0
  82. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/thresholds.py +0 -0
  83. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/to_lonlat.py +0 -0
  84. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/to_nc.py +0 -0
  85. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/toxarray.py +0 -0
  86. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/tozlev.py +0 -0
  87. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/unify.py +0 -0
  88. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/utils.py +0 -0
  89. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/validator.py +0 -0
  90. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/validator_funs.py +0 -0
  91. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/zip.py +0 -0
  92. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit/zonals.py +0 -0
  93. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/nctoolkit.egg-info/SOURCES.txt +0 -0
  94. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/requirements.txt +0 -0
  95. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/setup.cfg +0 -0
  96. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/testing/test_parallel.py +0 -0
  97. {nctoolkit-1.2.0 → nctoolkit-1.2.2}/testing/test_scripting.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: nctoolkit
3
- Version: 1.2.0
3
+ Version: 1.2.2
4
4
  Summary: A Python package for netCDF analysis and post-processing
5
5
  Home-page: https://github.com/pmlmodelling/nctoolkit
6
6
  Author: Robert Wilson
@@ -36,6 +36,19 @@ Requires-Dist: rioxarray; extra == "complete"
36
36
  Requires-Dist: cfchecker; extra == "complete"
37
37
  Requires-Dist: geocube; extra == "complete"
38
38
  Requires-Dist: geopandas; extra == "complete"
39
+ Dynamic: author
40
+ Dynamic: author-email
41
+ Dynamic: classifier
42
+ Dynamic: description
43
+ Dynamic: description-content-type
44
+ Dynamic: home-page
45
+ Dynamic: license-file
46
+ Dynamic: maintainer
47
+ Dynamic: project-url
48
+ Dynamic: provides-extra
49
+ Dynamic: requires-dist
50
+ Dynamic: requires-python
51
+ Dynamic: summary
39
52
 
40
53
 
41
54
 
@@ -128,6 +128,10 @@ def run_this(os_command, self, output="one", out_file=None, suppress=False):
128
128
 
129
129
  cores = session_info["cores"]
130
130
 
131
+ # if len(self) == 1:
132
+ # if cores > 1:
133
+ # os_command = os_command.replace("cdo ", f"cdo -P {cores} ")
134
+
131
135
  if len(self) == 1:
132
136
  output = "ensemble"
133
137
 
@@ -243,12 +247,16 @@ def run_this(os_command, self, output="one", out_file=None, suppress=False):
243
247
  if self._zip:
244
248
  ff_command = ff_command.replace("cdo ", "cdo -z zip ")
245
249
 
250
+ if session_info["cores"] > 1:
251
+ if len(self) == 1:
252
+ ff_command = ff_command.replace("cdo ", f"cdo -P {session_info['cores']} ")
246
253
  new_history.append(ff_command)
247
254
 
248
255
  #warnings.simplefilter("ignore")
249
256
 
250
257
  #with patch('sys.warnoptions', []):
251
258
 
259
+
252
260
  if cores > 1:
253
261
  temp = pool.apply_async(
254
262
  run_cdo,
@@ -288,13 +296,6 @@ def run_this(os_command, self, output="one", out_file=None, suppress=False):
288
296
  warnings.warn(mm)
289
297
  if mm in session_warnings:
290
298
  session_warnings.remove(mm)
291
- # remove element from session_warnings
292
-
293
- #session_warnings.remove(ff)
294
- #tidy_warnings(w)
295
- #if cores > 1:
296
- # pool.close()
297
-
298
299
 
299
300
  self.history = copy.deepcopy(new_history)
300
301
  self.current = copy.deepcopy(target_list)
@@ -324,6 +325,7 @@ def run_this(os_command, self, output="one", out_file=None, suppress=False):
324
325
 
325
326
  return None
326
327
 
328
+
327
329
  if ((output == "one") and (len(self) > 1)) or self._zip is False:
328
330
  new_history = copy.deepcopy(self._hold_history)
329
331
 
@@ -417,11 +419,15 @@ def run_this(os_command, self, output="one", out_file=None, suppress=False):
417
419
  warnings.warn(
418
420
  f"The following variables are not in all files, so were ignored when merging: {removed}"
419
421
  )
420
-
422
+
421
423
  target = run_cdo(
422
424
  os_command, target, out_file, precision=self._precision
423
425
  )
424
426
  else:
427
+ if session_info["cores"] > 1:
428
+ if len(self) == 1:
429
+ os_command = os_command.replace("cdo ", f"cdo -P {session_info['cores']} ")
430
+
425
431
  target = run_cdo(
426
432
  os_command, target, out_file, precision=self._precision
427
433
  )
@@ -55,6 +55,7 @@ def fix_label(x):
55
55
  new_x = new_x.replace("/m**3", "m$^{-3}$")
56
56
  new_x = new_x.replace("/m^3", "m$^{-3}$")
57
57
  new_x = new_x.replace("/m^2", "m$^{-2}$")
58
+ new_x = new_x.replace("/yr", "year$^{-1}$")
58
59
  new_x = new_x.replace("/m2", "m$^{-2}$")
59
60
  new_x = new_x.replace("/d)", "d$^{-1}$)")
60
61
  new_x = new_x.replace("/s)", "s$^{-1}$)")
@@ -413,6 +413,12 @@ def select_timesteps(self, times=None):
413
413
  if not isinstance(times, list):
414
414
  times = [times]
415
415
 
416
+ # coerce to int
417
+ try:
418
+ times = [int(x) if "int" in str(type(x)) else x for x in times]
419
+ except:
420
+ pass
421
+
416
422
  for tt in times:
417
423
  if not isinstance(tt, int):
418
424
  raise TypeError(f"{tt} is not an int")
@@ -32,32 +32,44 @@ def generate_level_bounds(self):
32
32
 
33
33
 
34
34
 
35
- def bottom(self):
35
+ def bottom(self, choice = "level"):
36
36
  """
37
- bottom: Extract the bottom level from a dataset
37
+ bottom: Extract the bottom level or value from a dataset
38
38
 
39
- This extracts the bottom level from each netCDF file. Please note that for
39
+ This extracts the bottom level or value from each netCDF file. Please note that for
40
40
  ensembles, it uses the first file to derive the index of the bottom level.
41
41
 
42
- You may need to double check that the bottom vertical level is the sea 'bottom' etc., as this is not always the case.
43
-
44
- Use bottom_mask for files when the bottom cell in netCDF files do not represent
45
- the actual bottom.
42
+ Parameters
43
+ -------------
44
+ choice : str
45
+ Set to 'level' to extract the bottom level, or 'value' to extract the bottommost non-missing value.
46
46
 
47
47
  Examples
48
48
  ------------
49
49
 
50
50
  If you wanted to extract the bottom vertical level of a dataset, do the following:
51
51
 
52
- >>> ds.bottom()
52
+ >>> ds.bottom(choice = 'level')
53
53
 
54
54
  This method is most useful for things like oceanic model data, where the bottom cell corresponds to the bottom of the ocean.
55
55
 
56
+ If you wanted to find the deepest non-missing value in a dataset, you would do the following:
57
+
58
+ >>> ds.bottom(choice = 'value')
59
+
56
60
  """
57
61
 
58
62
  # extract the number of the bottom level
59
63
  # Use the first file for an ensemble
60
64
  # pull the cdo command together, then run it or store it
65
+
66
+ if choice not in ["level", "value"]:
67
+ raise ValueError("Choice must be either 'level' or 'value'")
68
+
69
+ if choice == "value":
70
+ self.cdo_command("bottomvalue")
71
+ return None
72
+
61
73
  if len(self) > 1:
62
74
  ff = self.current[0]
63
75
  warnings.warn(
@@ -46,7 +46,7 @@ extras_require["complete"] = ["geoviews", "rioxarray", "cfchecker", "geocube", "
46
46
  REQUIREMENTS = [i.strip() for i in open("requirements.txt").readlines()]
47
47
 
48
48
  setup(name='nctoolkit',
49
- version='1.2.0',
49
+ version='1.2.2',
50
50
  description=DESCRIPTION,
51
51
  description_content_type='text/plain',
52
52
  long_description=LONG_DESCRIPTION,
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes