cloudnetpy 1.56.13__tar.gz → 1.56.14__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 (119) hide show
  1. {cloudnetpy-1.56.13/cloudnetpy.egg-info → cloudnetpy-1.56.14}/PKG-INFO +1 -1
  2. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/disdrometer/parsivel.py +48 -17
  3. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/products/classification.py +1 -1
  4. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/version.py +1 -1
  5. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14/cloudnetpy.egg-info}/PKG-INFO +1 -1
  6. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/LICENSE +0 -0
  7. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/MANIFEST.in +0 -0
  8. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/README.md +0 -0
  9. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/__init__.py +0 -0
  10. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/categorize/__init__.py +0 -0
  11. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/categorize/atmos.py +0 -0
  12. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/categorize/atmos_utils.py +0 -0
  13. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/categorize/categorize.py +0 -0
  14. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/categorize/classify.py +0 -0
  15. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/categorize/containers.py +0 -0
  16. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/categorize/droplet.py +0 -0
  17. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/categorize/falling.py +0 -0
  18. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/categorize/freezing.py +0 -0
  19. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/categorize/insects.py +0 -0
  20. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/categorize/lidar.py +0 -0
  21. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/categorize/melting.py +0 -0
  22. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/categorize/model.py +0 -0
  23. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/categorize/mwr.py +0 -0
  24. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/categorize/radar.py +0 -0
  25. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/cloudnetarray.py +0 -0
  26. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/concat_lib.py +0 -0
  27. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/constants.py +0 -0
  28. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/datasource.py +0 -0
  29. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/exceptions.py +0 -0
  30. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/__init__.py +0 -0
  31. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/basta.py +0 -0
  32. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/campbell_scientific.py +0 -0
  33. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/ceilo.py +0 -0
  34. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/ceilometer.py +0 -0
  35. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/cl61d.py +0 -0
  36. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/cloudnet_instrument.py +0 -0
  37. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/copernicus.py +0 -0
  38. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/disdrometer/__init__.py +0 -0
  39. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/disdrometer/common.py +0 -0
  40. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/disdrometer/thies.py +0 -0
  41. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/galileo.py +0 -0
  42. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/hatpro.py +0 -0
  43. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/instruments.py +0 -0
  44. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/lufft.py +0 -0
  45. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/mira.py +0 -0
  46. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/mrr.py +0 -0
  47. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/nc_lidar.py +0 -0
  48. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/nc_radar.py +0 -0
  49. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/pollyxt.py +0 -0
  50. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/radiometrics.py +0 -0
  51. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/rpg.py +0 -0
  52. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/rpg_reader.py +0 -0
  53. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/vaisala.py +0 -0
  54. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/instruments/weather_station.py +0 -0
  55. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/metadata.py +0 -0
  56. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/__init__.py +0 -0
  57. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/file_handler.py +0 -0
  58. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/metadata.py +0 -0
  59. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/model_metadata.py +0 -0
  60. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/plotting/__init__.py +0 -0
  61. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/plotting/plot_meta.py +0 -0
  62. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/plotting/plot_tools.py +0 -0
  63. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/plotting/plotting.py +0 -0
  64. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/products/__init__.py +0 -0
  65. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/products/advance_methods.py +0 -0
  66. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/products/grid_methods.py +0 -0
  67. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/products/model_products.py +0 -0
  68. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/products/observation_products.py +0 -0
  69. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/products/product_resampling.py +0 -0
  70. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/products/tools.py +0 -0
  71. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/statistics/__init__.py +0 -0
  72. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/statistics/statistical_methods.py +0 -0
  73. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/__init__.py +0 -0
  74. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/e2e/__init__.py +0 -0
  75. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/e2e/conftest.py +0 -0
  76. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/e2e/process_cf/__init__.py +0 -0
  77. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +0 -0
  78. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +0 -0
  79. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/__init__.py +0 -0
  80. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +0 -0
  81. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +0 -0
  82. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/__init__.py +0 -0
  83. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +0 -0
  84. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +0 -0
  85. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/unit/__init__.py +0 -0
  86. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/unit/conftest.py +0 -0
  87. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +0 -0
  88. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +0 -0
  89. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/unit/test_model_products.py +0 -0
  90. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +0 -0
  91. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +0 -0
  92. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py +0 -0
  93. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +0 -0
  94. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/tests/unit/test_tools.py +0 -0
  95. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/model_evaluation/utils.py +0 -0
  96. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/output.py +0 -0
  97. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/plotting/__init__.py +0 -0
  98. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/plotting/plot_meta.py +0 -0
  99. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/plotting/plotting.py +0 -0
  100. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/products/__init__.py +0 -0
  101. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/products/der.py +0 -0
  102. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/products/drizzle.py +0 -0
  103. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/products/drizzle_error.py +0 -0
  104. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/products/drizzle_tools.py +0 -0
  105. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/products/ier.py +0 -0
  106. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/products/iwc.py +0 -0
  107. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/products/lwc.py +0 -0
  108. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/products/mie_lu_tables.nc +0 -0
  109. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/products/mwr_tools.py +0 -0
  110. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/products/product_tools.py +0 -0
  111. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/py.typed +0 -0
  112. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy/utils.py +0 -0
  113. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy.egg-info/SOURCES.txt +0 -0
  114. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy.egg-info/dependency_links.txt +0 -0
  115. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy.egg-info/requires.txt +0 -0
  116. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/cloudnetpy.egg-info/top_level.txt +0 -0
  117. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/docs/source/conf.py +0 -0
  118. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/pyproject.toml +0 -0
  119. {cloudnetpy-1.56.13 → cloudnetpy-1.56.14}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudnetpy
3
- Version: 1.56.13
3
+ Version: 1.56.14
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -498,30 +498,58 @@ def _read_toa5(filename: str | PathLike) -> dict[str, list]:
498
498
  return data
499
499
 
500
500
 
501
- def _read_typ_op4a(filename: str | PathLike) -> dict[str, list]:
501
+ def _read_typ_op4a(lines: list[str]) -> dict[str, list]:
502
502
  """Read output of "CS/PA" command. The output starts with line "TYP OP4A"
503
503
  followed by one line per measured variable in format: <number>:<value>.
504
504
  Output ends with characters: <ETX><CR><LF><NUL>. Lines are separated by
505
505
  <CR><LF>.
506
506
  """
507
507
  data = {}
508
- with open(filename, encoding="latin1", errors="ignore") as file:
509
- for line in file:
510
- if ":" not in line:
511
- continue
512
- key, value = line.strip().split(":", maxsplit=1)
513
- # Skip datetime and 16-bit values.
514
- if key in ("19", "30", "31", "32", "33"):
515
- continue
516
- varname = TELEGRAM.get(int(key))
517
- if varname is None:
518
- continue
519
- parser = PARSERS.get(varname, next)
520
- tokens = value.split(";")
521
- data[varname] = [parser(iter(tokens))]
508
+ for line in lines:
509
+ if ":" not in line:
510
+ continue
511
+ key, value = line.strip().split(":", maxsplit=1)
512
+ # Skip datetime and 16-bit values.
513
+ if key in ("19", "30", "31", "32", "33"):
514
+ continue
515
+ varname = TELEGRAM.get(int(key))
516
+ if varname is None:
517
+ continue
518
+ parser = PARSERS.get(varname, next)
519
+ tokens = value.split(";")
520
+ data[varname] = [parser(iter(tokens))]
522
521
  return data
523
522
 
524
523
 
524
+ def _read_fmi(content: str):
525
+ """Read format used by Finnish Meteorological Institute and University of
526
+ Helsinki:
527
+ - "[YYYY-MM-DD HH:MM:SS\n"
528
+ - output of "CS/PA" command without non-printable characters at the end
529
+ - "]\n"
530
+ """
531
+ output: dict[str, Any] = defaultdict(list)
532
+ for m in re.finditer(
533
+ r"\[(?P<year>\d+)-(?P<month>\d+)-(?P<day>\d+) "
534
+ r"(?P<hour>\d+):(?P<minute>\d+):(?P<second>\d+)"
535
+ r"(?P<output>[^\]]*)\]",
536
+ content,
537
+ ):
538
+ for key, value in _read_typ_op4a(m["output"].splitlines()).items():
539
+ output[key].append(value)
540
+ output["_datetime"].append(
541
+ datetime.datetime(
542
+ int(m["year"]),
543
+ int(m["month"]),
544
+ int(m["day"]),
545
+ int(m["hour"]),
546
+ int(m["minute"]),
547
+ int(m["second"]),
548
+ )
549
+ )
550
+ return output
551
+
552
+
525
553
  def _read_parsivel(
526
554
  filenames: Iterable[str | PathLike],
527
555
  telegram: Sequence[int | None] | None = None,
@@ -530,17 +558,20 @@ def _read_parsivel(
530
558
  combined_data = defaultdict(list)
531
559
  for filename in filenames:
532
560
  with open(filename, encoding="latin1", errors="ignore") as file:
533
- lines = file.read().splitlines()
561
+ content = file.read()
562
+ lines = content.splitlines()
534
563
  if not lines:
535
564
  msg = f"File '{filename}' is empty"
536
565
  raise DisdrometerDataError(msg)
537
566
  if "TOA5" in lines[0]:
538
567
  data = _read_toa5(filename)
539
568
  elif "TYP OP4A" in lines[0]:
540
- data = _read_typ_op4a(filename)
569
+ data = _read_typ_op4a(lines)
541
570
  elif "Date" in lines[0]:
542
571
  headers = _parse_headers(lines[0])
543
572
  data = _read_rows(headers, lines[1:])
573
+ elif "[" in lines[0]:
574
+ data = _read_fmi(content)
544
575
  elif telegram is not None:
545
576
  headers = _parse_telegram(telegram)
546
577
  data = _read_rows(headers, lines)
@@ -166,7 +166,7 @@ DEFINITIONS = {
166
166
  "Value 5: Good radar echo only.\n"
167
167
  "Value 6: No radar echo but known attenuation.\n"
168
168
  "Value 7: Radar echo corrected for liquid attenuation using microwave\n"
169
- " radiometer data."
169
+ " radiometer data.\n"
170
170
  "Value 8: Radar ground clutter.\n"
171
171
  "Value 9: Lidar clear-air molecular scattering."
172
172
  ),
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
2
  MINOR = 56
3
- PATCH = 13
3
+ PATCH = 14
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudnetpy
3
- Version: 1.56.13
3
+ Version: 1.56.14
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
File without changes
File without changes
File without changes
File without changes