pypromice 1.5.3__py3-none-any.whl → 1.6.0__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.

Potentially problematic release.


This version of pypromice might be problematic. Click here for more details.

Files changed (65) hide show
  1. pypromice/__init__.py +2 -0
  2. pypromice/{qc → core/qc}/percentiles/compute_thresholds.py +2 -2
  3. pypromice/{qc → core/qc}/persistence.py +22 -29
  4. pypromice/{process → core/qc}/value_clipping.py +3 -3
  5. pypromice/core/variables/__init__.py +1 -0
  6. pypromice/core/variables/air_temperature.py +64 -0
  7. pypromice/core/variables/gps.py +221 -0
  8. pypromice/core/variables/humidity.py +111 -0
  9. pypromice/core/variables/precipitation.py +108 -0
  10. pypromice/core/variables/pressure_transducer_depth.py +79 -0
  11. pypromice/core/variables/radiation.py +422 -0
  12. pypromice/core/variables/station_boom_height.py +49 -0
  13. pypromice/core/variables/station_pose.py +375 -0
  14. pypromice/io/bufr/__init__.py +0 -0
  15. pypromice/{postprocess → io/bufr}/bufr_to_csv.py +1 -1
  16. pypromice/{postprocess → io/bufr}/create_bufr_files.py +2 -2
  17. pypromice/{postprocess → io/bufr}/get_bufr.py +6 -6
  18. pypromice/{postprocess → io/bufr}/real_time_utilities.py +3 -3
  19. pypromice/io/ingest/__init__.py +0 -0
  20. pypromice/{utilities → io/ingest}/git.py +1 -3
  21. pypromice/io/ingest/l0.py +294 -0
  22. pypromice/io/ingest/l0_repository.py +103 -0
  23. pypromice/io/ingest/toa5.py +87 -0
  24. pypromice/{process → io}/write.py +1 -1
  25. pypromice/pipeline/L0toL1.py +291 -0
  26. pypromice/pipeline/L1toL2.py +233 -0
  27. pypromice/{process → pipeline}/L2toL3.py +97 -118
  28. pypromice/pipeline/__init__.py +4 -0
  29. pypromice/{process → pipeline}/aws.py +10 -82
  30. pypromice/{process → pipeline}/get_l2.py +2 -2
  31. pypromice/{process → pipeline}/get_l2tol3.py +19 -22
  32. pypromice/{process → pipeline}/join_l2.py +31 -32
  33. pypromice/{process → pipeline}/join_l3.py +16 -14
  34. pypromice/{process → pipeline}/resample.py +58 -45
  35. pypromice/{process → pipeline}/utilities.py +0 -22
  36. pypromice/resources/file_attributes.csv +4 -4
  37. pypromice/resources/variables.csv +27 -24
  38. {pypromice-1.5.3.dist-info → pypromice-1.6.0.dist-info}/METADATA +1 -2
  39. pypromice-1.6.0.dist-info/RECORD +64 -0
  40. pypromice-1.6.0.dist-info/entry_points.txt +12 -0
  41. pypromice/get/__init__.py +0 -1
  42. pypromice/get/get.py +0 -211
  43. pypromice/get/get_promice_data.py +0 -56
  44. pypromice/process/L0toL1.py +0 -564
  45. pypromice/process/L1toL2.py +0 -824
  46. pypromice/process/__init__.py +0 -4
  47. pypromice/process/load.py +0 -161
  48. pypromice-1.5.3.dist-info/RECORD +0 -54
  49. pypromice-1.5.3.dist-info/entry_points.txt +0 -13
  50. /pypromice/{postprocess → core}/__init__.py +0 -0
  51. /pypromice/{utilities → core}/dependency_graph.py +0 -0
  52. /pypromice/{qc → core/qc}/__init__.py +0 -0
  53. /pypromice/{qc → core/qc}/github_data_issues.py +0 -0
  54. /pypromice/{qc → core/qc}/percentiles/__init__.py +0 -0
  55. /pypromice/{qc → core/qc}/percentiles/outlier_detector.py +0 -0
  56. /pypromice/{qc → core/qc}/percentiles/thresholds.csv +0 -0
  57. /pypromice/{process → core/variables}/wind.py +0 -0
  58. /pypromice/{utilities → io}/__init__.py +0 -0
  59. /pypromice/{postprocess → io/bufr}/bufr_utilities.py +0 -0
  60. /pypromice/{postprocess → io/bufr}/positions_seed.csv +0 -0
  61. /pypromice/{station_configuration.py → io/bufr/station_configuration.py} +0 -0
  62. /pypromice/{postprocess → io}/make_metadata_csv.py +0 -0
  63. {pypromice-1.5.3.dist-info → pypromice-1.6.0.dist-info}/WHEEL +0 -0
  64. {pypromice-1.5.3.dist-info → pypromice-1.6.0.dist-info}/licenses/LICENSE.txt +0 -0
  65. {pypromice-1.5.3.dist-info → pypromice-1.6.0.dist-info}/top_level.txt +0 -0
@@ -3,21 +3,20 @@ import logging, sys, os, unittest
3
3
  import pandas as pd
4
4
  import xarray as xr
5
5
  from argparse import ArgumentParser
6
- from pypromice.process.L1toL2 import correctPrecip
7
- from pypromice.process.write import prepare_and_write
6
+ from pypromice.io.write import prepare_and_write
8
7
  logger = logging.getLogger(__name__)
9
8
 
10
9
  def parse_arguments_join():
11
10
  parser = ArgumentParser(description="AWS L2 joiner for merging together two L2 products, for example an L2 RAW and L2 TX data product. An hourly, daily and monthly L2 data product is outputted to the defined output path")
12
11
  parser.add_argument('-s', '--file1', type=str, required=True,
13
12
  help='Path to source L2 file, which will be preferenced in merge process')
14
- parser.add_argument('-t', '--file2', type=str, required=True,
13
+ parser.add_argument('-t', '--file2', type=str, required=True,
15
14
  help='Path to target L2 file, which will be used to fill gaps in merge process')
16
- parser.add_argument('-o', '--outpath', default=os.getcwd(), type=str, required=True,
15
+ parser.add_argument('-o', '--outpath', default=os.getcwd(), type=str, required=True,
17
16
  help='Path where to write output')
18
- parser.add_argument('-v', '--variables', default=None, type=str, required=False,
17
+ parser.add_argument('-v', '--variables', default=None, type=str, required=False,
19
18
  help='Path to variables look-up table .csv file for variable name retained'''),
20
- parser.add_argument('-m', '--metadata', default=None, type=str, required=False,
19
+ parser.add_argument('-m', '--metadata', default=None, type=str, required=False,
21
20
  help='Path to metadata table .csv file for metadata information'''),
22
21
  args = parser.parse_args()
23
22
  return args
@@ -25,7 +24,7 @@ def parse_arguments_join():
25
24
  def loadArr(infile):
26
25
  if infile.split('.')[-1].lower() == 'csv':
27
26
  df = pd.read_csv(infile, index_col=0, parse_dates=True)
28
- ds = xr.Dataset.from_dataframe(df)
27
+ ds = xr.Dataset.from_dataframe(df)
29
28
  elif infile.split('.')[-1].lower() == 'nc':
30
29
  with xr.open_dataset(infile) as ds:
31
30
  ds.load()
@@ -35,7 +34,7 @@ def loadArr(infile):
35
34
  ds[varname].encoding = {}
36
35
 
37
36
  try:
38
- name = ds.attrs['station_id']
37
+ name = ds.attrs['station_id']
39
38
  except:
40
39
  name = infile.split('/')[-1].split('.')[0].split('_hour')[0].split('_10min')[0]
41
40
  ds.attrs['station_id'] = name
@@ -46,7 +45,6 @@ def loadArr(infile):
46
45
 
47
46
  logger.info(f'{name} array loaded from {infile}')
48
47
  return ds, name
49
-
50
48
 
51
49
  def join_l2(file1,file2,outpath,variables,metadata) -> xr.Dataset:
52
50
  logging.basicConfig(
@@ -55,43 +53,44 @@ def join_l2(file1,file2,outpath,variables,metadata) -> xr.Dataset:
55
53
  stream=sys.stdout,
56
54
  )
57
55
  # Check files
58
- if os.path.isfile(file1) and os.path.isfile(file2):
56
+ if os.path.isfile(file1) and os.path.isfile(file2):
59
57
 
60
58
  # Load data arrays
61
59
  ds1, n1 = loadArr(file1)
62
- ds2, n2 = loadArr(file2)
63
-
60
+ ds2, n2 = loadArr(file2)
61
+
64
62
  # Check stations match
65
63
  if n1.lower() == n2.lower():
66
-
67
- # Merge arrays
64
+ # Merge arrays
68
65
  logger.info(f'Combining {file1} with {file2}...')
69
66
  name = n1
70
67
  all_ds = ds1.combine_first(ds2)
71
68
 
72
- # Re-calculate corrected precipitation
73
- if hasattr(all_ds, 'precip_u_cor'):
74
- if ~all_ds['precip_u_cor'].isnull().all():
75
- all_ds['precip_u_cor'], _ = correctPrecip(all_ds['precip_u'],
76
- all_ds['wspd_u'])
77
- if hasattr(all_ds, 'precip_l_cor'):
78
- if ~all_ds['precip_l_cor'].isnull().all():
79
- all_ds['precip_l_cor'], _ = correctPrecip(all_ds['precip_l'],
80
- all_ds['wspd_l'])
69
+ # combine_first works terrible for accumulated values
70
+ # we rather combine semi-accumulated precipitation in block
71
+ for var in ['precip_u', 'precip_l']:
72
+ if hasattr(all_ds, var):
73
+ if all_ds[var].notnull().any():
74
+ tx_data_no_overlap =(ds2[var]
75
+ .sel(time=slice(ds1.time.values[-1], ds2.time.values[-1]))
76
+ .isel(time=slice(1, None))) # this line prevents redundant timestamps
77
+ all_ds[var] = xr.concat(
78
+ [ds1[var], tx_data_no_overlap], dim='time'
79
+ ).sortby('time')
81
80
  else:
82
81
  logger.info(f'Mismatched station names {n1}, {n2}')
83
- exit()
84
-
85
- elif os.path.isfile(file1):
82
+ exit()
83
+
84
+ elif os.path.isfile(file1):
86
85
  ds1, name = loadArr(file1)
87
86
  logger.info(f'Only one file found {file1}...')
88
- all_ds = ds1
87
+ all_ds = ds1
89
88
 
90
89
  elif os.path.isfile(file2):
91
90
  ds2, name = loadArr(file2)
92
91
  logger.info(f'Only one file found {file2}...')
93
- all_ds = ds2
94
-
92
+ all_ds = ds2
93
+
95
94
  else:
96
95
  logger.info(f'Invalid files {file1}, {file2}')
97
96
  exit()
@@ -100,13 +99,13 @@ def join_l2(file1,file2,outpath,variables,metadata) -> xr.Dataset:
100
99
 
101
100
  # Resample to hourly, daily and monthly datasets and write to file
102
101
  prepare_and_write(all_ds, outpath, variables, metadata, resample = False)
103
-
102
+
104
103
  logger.info(f'Files saved to {os.path.join(outpath, name)}...')
105
104
  return all_ds
106
105
 
107
106
  def main():
108
107
  args = parse_arguments_join()
109
108
  _ = join_l2(args.file1, args.file2, args.outpath, args.variables, args.metadata)
110
-
111
- if __name__ == "__main__":
109
+
110
+ if __name__ == "__main__":
112
111
  main()
@@ -3,10 +3,11 @@ import json
3
3
  import logging, os, sys, toml
4
4
  from argparse import ArgumentParser
5
5
 
6
- from pypromice.utilities.git import get_commit_hash_and_check_dirty
6
+ from pypromice.io.ingest.git import get_commit_hash_and_check_dirty
7
7
 
8
8
  import pypromice.resources
9
- from pypromice.process.write import prepare_and_write
9
+ from pypromice.io.write import prepare_and_write
10
+
10
11
  import numpy as np
11
12
  import pandas as pd
12
13
  import xarray as xr
@@ -493,20 +494,21 @@ def join_l3(config_folder, site, folder_l3, folder_gcnet, outpath, variables, me
493
494
  l3_merged.z_ice_surf.to_series(), l3.z_ice_surf.to_series()
494
495
  ),
495
496
  )
496
-
497
+
497
498
  # saves attributes
498
499
  attrs = l3_merged.attrs
499
500
  # merging by time block
500
- l3_merged = xr.concat(
501
- (
502
- l3.sel(
503
- time=slice(l3.time.isel(time=0), l3_merged.time.isel(time=0))
504
- ),
505
- l3_merged,
506
- ),
507
- dim="time",
508
- )
509
-
501
+ t_start = l3.time.values[0]
502
+ t_stop = l3_merged.time.values[0]
503
+
504
+ l3_part = l3.sel(time=slice(t_start, t_stop))
505
+
506
+ # we don't want the first timestamp of l3_merged to also be in l3
507
+ if l3_part.time.values[-1] == t_stop:
508
+ l3_part = l3_part.isel(time=slice(None, -1))
509
+
510
+ l3_merged = xr.concat([l3_part, l3_merged], dim="time")
511
+
510
512
  # restauring attributes
511
513
  l3_merged.attrs = attrs
512
514
 
@@ -540,7 +542,7 @@ def join_l3(config_folder, site, folder_l3, folder_gcnet, outpath, variables, me
540
542
  if outpath is not None:
541
543
  prepare_and_write(l3_merged, outpath, v, m, "60min", nc_compression=True)
542
544
  prepare_and_write(l3_merged, outpath, v, m, "1D", nc_compression=True)
543
- prepare_and_write(l3_merged, outpath, v, m, "M", nc_compression=True)
545
+ prepare_and_write(l3_merged, outpath, v, m, "MS", nc_compression=True)
544
546
  return l3_merged, sorted_list_station_data
545
547
 
546
548
 
@@ -7,8 +7,9 @@ Created on Mon Jun 10 10:58:39 2024
7
7
  """
8
8
  import logging
9
9
  import numpy as np
10
+ import pandas as pd
10
11
  import xarray as xr
11
- from pypromice.process.wind import calculate_directional_wind_speed
12
+ from pypromice.core.variables.wind import calculate_directional_wind_speed
12
13
  logger = logging.getLogger(__name__)
13
14
 
14
15
  def resample_dataset(ds_h, t):
@@ -24,7 +25,7 @@ def resample_dataset(ds_h, t):
24
25
  ds_h : xarray.Dataset
25
26
  L3 AWS dataset either at 10 min (for raw data) or hourly (for tx data)
26
27
  t : str
27
- Resample factor, same variable definition as in
28
+ Resample factor( "60min", "1D" or "MS"), same variable definition as in
28
29
  pandas.DataFrame.resample()
29
30
 
30
31
  Returns
@@ -33,20 +34,33 @@ def resample_dataset(ds_h, t):
33
34
  L3 AWS dataset resampled to the frequency defined by t
34
35
  '''
35
36
  # Convert dataset to DataFrame
36
- df_d = ds_h.to_dataframe()
37
-
37
+ df_h = ds_h.to_dataframe()
38
+
38
39
  # Identify non-numeric columns
39
- non_numeric_cols = df_d.select_dtypes(exclude=['number']).columns
40
-
40
+ non_numeric_cols = df_h.select_dtypes(exclude=['number']).columns
41
+
41
42
  # Log a warning and drop non-numeric columns
42
43
  if len(non_numeric_cols) > 0:
43
44
  for col in non_numeric_cols:
44
- unique_values = df_d[col].unique()
45
- logger.warning(f"Dropping column '{col}' because it is of type '{df_d[col].dtype}' and contains unique values: {unique_values}")
45
+ unique_values = df_h[col].unique()
46
+ logger.warning(f"Dropping column '{col}' because it is of type '{df_h[col].dtype}' and contains unique values: {unique_values}")
46
47
 
47
- df_d = df_d.drop(columns=non_numeric_cols)
48
+ df_h = df_h.drop(columns=non_numeric_cols)
48
49
  # Resample the DataFrame
49
- df_d = df_d.resample(t).mean()
50
+ df_resampled = df_h.resample(t).mean()
51
+
52
+ # exception for precip_u and precip_l which are semi-accumulated with some resets
53
+ # Taking the max value within the resampled time step will preserve the
54
+ # general shape of the curve
55
+ for var in ['precip_u', 'precip_l']:
56
+ if var in df_h.columns:
57
+ df_resampled[var] = df_h[var].resample(t).max()
58
+
59
+ # exception for rainfall which should be summed when aggregated into
60
+ # hourly/daily/monthly values. This ignores missing data.
61
+ for var in ['rainfall_u', 'rainfall_cor_u', 'rainfall_l', 'rainfall_cor_l']:
62
+ if var in df_h.columns:
63
+ df_resampled[var] = df_h[var].resample(t).sum()
50
64
 
51
65
  # taking the 10 min data and using it as instantaneous values:
52
66
  is_10_minutes_timestamp = (ds_h.time.diff(dim='time') / np.timedelta64(1, 's') == 600)
@@ -54,75 +68,75 @@ def resample_dataset(ds_h, t):
54
68
  cols_to_update = ['p_i', 't_i', 'rh_i', 'rh_i_wrt_ice_or_water', 'wspd_i', 'wdir_i','wspd_x_i','wspd_y_i']
55
69
  cols_origin = ['p_u', 't_u', 'rh_u', 'rh_u_wrt_ice_or_water', 'wspd_u', 'wdir_u','wspd_x_u','wspd_y_u']
56
70
  timestamp_10min = ds_h.time.where(is_10_minutes_timestamp, drop=True).to_index()
57
- timestamp_round_hour = df_d.index
71
+ timestamp_round_hour = df_resampled.index
58
72
  timestamp_to_update = timestamp_round_hour.intersection(timestamp_10min)
59
-
73
+
60
74
  for col, col_org in zip(cols_to_update, cols_origin):
61
- if col not in df_d.columns:
62
- df_d[col] = np.nan
75
+ if col not in df_resampled.columns:
76
+ df_resampled[col] = np.nan
63
77
  else:
64
78
  # if there are already instantaneous values in the dataset
65
79
  # we want to keep them as they are
66
80
  # removing timestamps where there is already t_i filled from a TX file
67
81
  missing_instantaneous = ds_h.reindex(time=timestamp_to_update)[col].isnull()
68
82
  timestamp_to_update = timestamp_to_update[missing_instantaneous]
69
- df_d.loc[timestamp_to_update, col] = ds_h.reindex(
83
+ df_resampled.loc[timestamp_to_update, col] = ds_h.reindex(
70
84
  time= timestamp_to_update
71
85
  )[col_org].values
72
86
  if col == 'p_i':
73
- df_d.loc[timestamp_to_update, col] = df_d.loc[timestamp_to_update, col].values-1000
74
-
87
+ df_resampled.loc[timestamp_to_update, col] = df_resampled.loc[timestamp_to_update, col].values-1000
75
88
 
76
89
  # recalculating wind direction from averaged directional wind speeds
77
90
  for var in ['wdir_u','wdir_l']:
78
91
  boom = var.split('_')[1]
79
- if var in df_d.columns:
80
- if ('wspd_x_'+boom in df_d.columns) & ('wspd_y_'+boom in df_d.columns):
81
- df_d[var] = _calcWindDir(df_d['wspd_x_'+boom], df_d['wspd_y_'+boom])
92
+ if var in df_resampled.columns:
93
+ if ('wspd_x_'+boom in df_resampled.columns) & ('wspd_y_'+boom in df_resampled.columns):
94
+ df_resampled[var] = _calcWindDir(df_resampled['wspd_x_'+boom], df_resampled['wspd_y_'+boom])
82
95
  else:
83
96
  logger.info(var+' in dataframe but not wspd_x_'+boom+' nor wspd_y_'+boom+', recalculating them')
84
97
  ds_h['wspd_x_'+boom], ds_h['wspd_y_'+boom] = calculate_directional_wind_speed(ds_h['wspd_'+boom], ds_h['wdir_'+boom])
85
- df_d[['wspd_x_'+boom, 'wspd_y_'+boom]] = ds_h[['wspd_x_'+boom, 'wspd_y_'+boom]].to_dataframe().resample(t).mean()
86
- df_d[var] = _calcWindDir(df_d['wspd_x_'+boom], df_d['wspd_y_'+boom])
87
-
98
+ df_resampled[['wspd_x_'+boom, 'wspd_y_'+boom]] = ds_h[['wspd_x_'+boom, 'wspd_y_'+boom]].to_dataframe().resample(t).mean()
99
+ df_resampled[var] = _calcWindDir(df_resampled['wspd_x_'+boom], df_resampled['wspd_y_'+boom])
100
+
88
101
  # recalculating relative humidity from average vapour pressure and average
89
102
  # saturation vapor pressure
90
103
  for var in ['rh_u','rh_l']:
91
104
  lvl = var.split('_')[1]
92
- if var in df_d.columns:
105
+ if var in df_resampled.columns:
93
106
  if ('t_'+lvl in ds_h.keys()):
94
107
  es_wtr, es_cor = calculateSaturationVaporPressure(ds_h['t_'+lvl])
95
108
  p_vap = ds_h[var] / 100 * es_wtr
96
-
97
- df_d[var] = (p_vap.to_series().resample(t).mean() \
109
+
110
+ df_resampled[var] = (p_vap.to_series().resample(t).mean() \
98
111
  / es_wtr.to_series().resample(t).mean())*100
99
- if var+'_wrt_ice_or_water' in df_d.keys():
100
- df_d[var+'_wrt_ice_or_water'] = (p_vap.to_series().resample(t).mean() \
112
+ if var+'_wrt_ice_or_water' in df_resampled.keys():
113
+ df_resampled[var+'_wrt_ice_or_water'] = (p_vap.to_series().resample(t).mean() \
101
114
  / es_cor.to_series().resample(t).mean())*100
102
-
115
+
103
116
  # passing each variable attribute to the ressample dataset
104
117
  vals = []
105
- for c in df_d.columns:
118
+ for c in df_resampled.columns:
106
119
  if c in ds_h.data_vars:
107
120
  vals.append(xr.DataArray(
108
- data=df_d[c], dims=['time'],
109
- coords={'time':df_d.index}, attrs=ds_h[c].attrs))
121
+ data=df_resampled[c], dims=['time'],
122
+ coords={'time':df_resampled.index}, attrs=ds_h[c].attrs))
110
123
  else:
111
124
  vals.append(xr.DataArray(
112
- data=df_d[c], dims=['time'],
113
- coords={'time':df_d.index}, attrs=None))
114
-
115
- ds_d = xr.Dataset(dict(zip(df_d.columns,vals)), attrs=ds_h.attrs)
116
- return ds_d
125
+ data=df_resampled[c], dims=['time'],
126
+ coords={'time':df_resampled.index}, attrs=None))
127
+
128
+ ds_resampled = xr.Dataset(dict(zip(df_resampled.columns,vals)), attrs=ds_h.attrs)
129
+
130
+ return ds_resampled
117
131
 
118
132
 
119
133
  def calculateSaturationVaporPressure(t, T_0=273.15, T_100=373.15, es_0=6.1071,
120
- es_100=1013.246, eps=0.622):
134
+ es_100=1013.246, eps=0.622):
121
135
  '''Calculate specific humidity
122
-
136
+
123
137
  Parameters
124
138
  ----------
125
- T_0 : float
139
+ T_0 : float
126
140
  Steam point temperature. Default is 273.15.
127
141
  T_100 : float
128
142
  Steam point temperature in Kelvin
@@ -132,14 +146,13 @@ def calculateSaturationVaporPressure(t, T_0=273.15, T_100=373.15, es_0=6.1071,
132
146
  Saturation vapour pressure at the melting point (hPa)
133
147
  es_100 : float
134
148
  Saturation vapour pressure at steam point temperature (hPa)
135
-
136
149
  Returns
137
150
  -------
138
151
  xarray.DataArray
139
152
  Saturation vapour pressure with regard to water above 0 C (hPa)
140
153
  xarray.DataArray
141
154
  Saturation vapour pressure where subfreezing timestamps are with regards to ice (hPa)
142
- '''
155
+ '''
143
156
  # Saturation vapour pressure above 0 C (hPa)
144
157
  es_wtr = 10**(-7.90298 * (T_100 / (t + T_0) - 1) + 5.02808 * np.log10(T_100 / (t + T_0))
145
158
  - 1.3816E-7 * (10**(11.344 * (1 - (t + T_0) / T_100)) - 1)
@@ -149,11 +162,11 @@ def calculateSaturationVaporPressure(t, T_0=273.15, T_100=373.15, es_0=6.1071,
149
162
  es_ice = 10**(-9.09718 * (T_0 / (t + T_0) - 1) - 3.56654
150
163
  * np.log10(T_0 / (t + T_0)) + 0.876793
151
164
  * (1 - (t + T_0) / T_0)
152
- + np.log10(es_0))
153
-
165
+ + np.log10(es_0))
166
+
154
167
  # Saturation vapour pressure (hPa)
155
168
  es_cor = xr.where(t < 0, es_ice, es_wtr)
156
-
169
+
157
170
  return es_wtr, es_cor
158
171
 
159
172
  def _calcWindDir(wspd_x, wspd_y):
@@ -44,25 +44,3 @@ def addBasicMeta(ds, vars_df):
44
44
  ds[v].attrs[c] = vars_df[c][v]
45
45
  return ds
46
46
 
47
- def populateMeta(ds, conf, skip):
48
- '''Populate L0 Dataset with metadata dictionary
49
-
50
- Parameters
51
- ----------
52
- ds : xarray.Dataset
53
- L0 dataset
54
- conf : dict
55
- Metadata dictionary
56
- skip : list
57
- List of column names to skip parsing to metadata
58
-
59
- Returns
60
- -------
61
- ds : xarray.Dataset
62
- L0 dataset with metadata populated as Dataset attributes
63
- '''
64
- # skip = ["columns", "skiprows"]
65
- for k in conf.keys():
66
- if k not in skip: ds.attrs[k] = conf[k]
67
- return ds
68
-
@@ -3,13 +3,13 @@ acknowledgements,The Programme for Monitoring of the Greenland Ice Sheet (PROMIC
3
3
  alt.axis,Z
4
4
  alt.coverage_content_type,coordinate
5
5
  gps_alt.positive,up
6
- cdm_data_type,
6
+ cdm_data_type,Station
7
7
  comment,https://doi.org/10.22008/promice/data/aws
8
8
  contributor_name,
9
9
  contributor_role,
10
10
  conventions,ACDD-1.3; CF-1.7
11
- creater_email,pho@geus.dk
12
- creater_url,https://promice.dk
11
+ creator_email,pho@geus.dk
12
+ creator_url,https://promice.dk
13
13
  creator_institution,Geological Survey of Denmark and Greenland (GEUS)
14
14
  creator_name,Penelope How
15
15
  creator_type,person
@@ -22,7 +22,7 @@ geospatial_lon_extents_match,gps_lon
22
22
  geospatial_lon_resolution,
23
23
  geospatial_lon_units,degrees_east
24
24
  geospatial_vertical_resolution,
25
- geospatial_vertical_units,EPSG:4979
25
+ geospatial_vertical_units,meters
26
26
  institution,Geological Survey of Denmark and Greenland (GEUS)
27
27
  instrument,See https://doi.org/10.5194/essd-13-3819-2021
28
28
  instrument_vocabulary,GCMD:GCMD Keywords
@@ -1,18 +1,18 @@
1
- field,standard_name,long_name,units,coverage_content_type,coordinates,instantaneous_hourly,where_to_find,lo,hi,OOL,station_type,L0,L2,L3,max_decimals
1
+ field,standard_name,long_name,units,coverage_content_type,coordinates,instantaneous_hourly,where_to_find,lo,hi,dependent_variables,station_type,L0,L2,L3,max_decimals
2
2
  time,time,Time,yyyy-mm-dd HH:MM:SS,physicalMeasurement,time,,,,,,all,1,1,1,
3
3
  rec,record,Record,-,referenceInformation,time,,L0 or L2,,,,all,1,1,0,0
4
- p_u,air_pressure,Air pressure (upper boom),hPa,physicalMeasurement,time,FALSE,,650,1100,"",all,1,1,1,4
5
- p_l,air_pressure,Air pressure (lower boom),hPa,physicalMeasurement,time,FALSE,,650,1100,"",two-boom,1,1,1,4
6
- t_u,air_temperature,Air temperature (upper boom),degrees_C,physicalMeasurement,time,FALSE,,-80,40,"",all,1,1,1,4
7
- t_l,air_temperature,Air temperature (lower boom),degrees_C,physicalMeasurement,time,FALSE,,-80,40,"",two-boom,1,1,1,4
8
- rh_u,relative_humidity,Relative humidity (upper boom),%,physicalMeasurement,time,FALSE,,0,100,"",all,1,1,1,4
4
+ p_u,air_pressure,Air pressure (upper boom),hPa,physicalMeasurement,time,FALSE,,650,1100,z_pt_cor dlhf_u dshf_u,all,1,1,1,4
5
+ p_l,air_pressure,Air pressure (lower boom),hPa,physicalMeasurement,time,FALSE,,650,1100,dlhf_l dshf_l,two-boom,1,1,1,4
6
+ t_u,air_temperature,Air temperature (upper boom),degrees_C,physicalMeasurement,time,FALSE,,-80,40,z_boom_cor_l z_boom_cor_u z_stake_cor qh_u rh_u_wrt_ice_or_water dlhf_u dshf_u,all,1,1,1,4
7
+ t_l,air_temperature,Air temperature (lower boom),degrees_C,physicalMeasurement,time,FALSE,,-80,40,dlhf_l dshf_l,two-boom,1,1,1,4
8
+ rh_u,relative_humidity,Relative humidity (upper boom),%,physicalMeasurement,time,FALSE,,0,100,qh_u rh_u_wrt_ice_or_water dlhf_u dshf_u,all,1,1,1,4
9
9
  rh_u_wrt_ice_or_water,relative_humidity_with_respect_to_ice_or_water,Relative humidity (upper boom) with respect to saturation over ice in subfreezing conditions and over water otherwise,%,modelResult,time,FALSE,L2 or later,0,150,"",all,0,1,1,4
10
10
  qh_u,specific_humidity,Specific humidity (upper boom),kg/kg,modelResult,time,FALSE,L2 or later,0,100,"",all,0,1,1,4
11
- rh_l,relative_humidity,Relative humidity (lower boom),%,physicalMeasurement,time,FALSE,,0,100,"",two-boom,1,1,1,4
11
+ rh_l,relative_humidity,Relative humidity (lower boom),%,physicalMeasurement,time,FALSE,,0,100,qh_l rh_l_wrt_ice_or_water dlhf_l dshf_l,two-boom,1,1,1,4
12
12
  rh_l_wrt_ice_or_water,relative_humidity_with_respect_to_ice_or_water,Relative humidity (lower boom) with respect to saturation over ice in subfreezing conditions and over water otherwise,%,modelResult,time,FALSE,L2 or later,0,150,"",two-boom,0,1,1,4
13
13
  qh_l,specific_humidity,Specific humidity (lower boom),kg/kg,modelResult,time,FALSE,L2 or later,0,100,,two-boom,0,1,1,4
14
- wspd_u,wind_speed,Wind speed (upper boom),m s-1,physicalMeasurement,time,FALSE,,0,100,wdir_u wspd_x_u wspd_y_u,all,1,1,1,4
15
- wspd_l,wind_speed,Wind speed (lower boom),m s-1,physicalMeasurement,time,FALSE,,0,100,wdir_l wspd_x_l wspd_y_l,two-boom,1,1,1,4
14
+ wspd_u,wind_speed,Wind speed (upper boom),m s-1,physicalMeasurement,time,FALSE,,0,100,wdir_u wspd_x_u wspd_y_u rainfall_cor_u,all,1,1,1,4
15
+ wspd_l,wind_speed,Wind speed (lower boom),m s-1,physicalMeasurement,time,FALSE,,0,100,wdir_l wspd_x_l wspd_y_l rainfall_cor_l,two-boom,1,1,1,4
16
16
  wdir_u,wind_from_direction,Wind from direction (upper boom),degrees,physicalMeasurement,time,FALSE,,1,360,wspd_x_u wspd_y_u,all,1,1,1,4
17
17
  wdir_std_u,wind_from_direction_standard_deviation,Wind from direction (standard deviation),degrees,qualityInformation,time,FALSE,L0 or L2,,,,one-boom,1,1,0,4
18
18
  wdir_l,wind_from_direction,Wind from direction (lower boom),degrees,physicalMeasurement,time,FALSE,,1,360,wspd_x_l wspd_y_l,two-boom,1,1,1,4
@@ -33,23 +33,26 @@ dlhf_u,surface_downward_latent_heat_flux,Latent heat flux (upper boom),W m-2,mod
33
33
  dlhf_l,surface_downward_latent_heat_flux,Latent heat flux (lower boom),W m-2,modelResult,time,FALSE,L3 or later,,,,two-boom,0,0,1,4
34
34
  dshf_u,surface_downward_sensible_heat_flux,Sensible heat flux (upper boom),W m-2,modelResult,time,FALSE,L3 or later,,,,all,0,0,1,4
35
35
  dshf_l,surface_downward_sensible_heat_flux,Sensible heat flux (lower boom),W m-2,modelResult,time,FALSE,L3 or later,,,,two-boom,0,0,1,4
36
- z_boom_u,distance_to_surface_from_boom,Upper boom height,m,physicalMeasurement,time,TRUE,,0.3,10,"",all,1,1,1,4
36
+ z_boom_u,distance_to_surface_from_boom,Upper boom height,m,physicalMeasurement,time,TRUE,,0.3,10,z_boom_cor_u,all,1,1,1,4
37
+ z_boom_cor_u,distance_to_surface_from_boom_corrected,Upper boom height - corrected,m,modelResult,time,TRUE,,0.3,10,"",all,1,1,1,4
37
38
  z_boom_q_u,distance_to_surface_from_boom_quality,Upper boom height (quality),-,qualityInformation,time,TRUE,L0 or L2,,,,all,1,1,0,4
38
- z_boom_l,distance_to_surface_from_boom,Lower boom height,m,physicalMeasurement,time,TRUE,,0.3,5,"",two-boom,1,1,1,4
39
+ z_boom_l,distance_to_surface_from_boom,Lower boom height,m,physicalMeasurement,time,TRUE,,0.3,5,z_boom_cor_l,two-boom,1,1,1,4
40
+ z_boom_cor_l,distance_to_surface_from_boom_corrected,Lower boom height - corrected,m,modelResult,time,TRUE,,0.3,5,"",two-boom,1,1,1,4
39
41
  z_boom_q_l,distance_to_surface_from_boom_quality,Lower boom height (quality),-,qualityInformation,time,TRUE,L0 or L2,,,,two-boom,1,1,0,4
40
- z_stake,distance_to_surface_from_stake_assembly,Stake height,m,physicalMeasurement,time,TRUE,,0.3,8,,one-boom,1,1,1,4
42
+ z_stake,distance_to_surface_from_stake_assembly,Stake height,m,physicalMeasurement,time,TRUE,,0.3,8,z_stake_cor,one-boom,1,1,1,4
43
+ z_stake_cor,distance_to_surface_from_stake_assembly_corrected,Stake height - corrected,m,physicalMeasurement,time,TRUE,,0.3,8,,one-boom,1,1,1,4
41
44
  z_stake_q,distance_to_surface_from_stake_assembly_quality,Stake height (quality),-,qualityInformation,time,TRUE,L0 or L2,,,,one-boom,1,1,0,4
42
- z_pt,depth_of_pressure_transducer_in_ice,Depth of pressure transducer in ice,m,physicalMeasurement,time,FALSE,,0,30,"",one-boom,1,1,1,4
45
+ z_pt,depth_of_pressure_transducer_in_ice,Depth of pressure transducer in ice,m,physicalMeasurement,time,FALSE,,0,30,z_pt_cor,one-boom,1,1,1,4
43
46
  z_pt_cor,depth_of_pressure_transducer_in_ice_corrected,Depth of pressure transducer in ice - corrected,m,modelResult,time,FALSE,L2 or later,0,30,,one-boom,0,1,1,4
44
47
  z_surf_combined,height_of_surface_combined,"Surface height combined from multiple sensors, relative to ice surface height at installation",m,modelResult,time,FALSE,L3,,,,all,0,0,1,4
45
48
  z_ice_surf,height_of_ice_surface,"Ice surface height, relative to ice surface height at installation and calculated from pt_cor and z_stake",m,modelResult,time,FALSE,L3,,,,one-boom,0,0,1,4
46
49
  snow_height,height_of_snow,"Snow surface height, relative to ice surface",m,modelResult,time,FALSE,L3,0,,,one-boom,0,0,1,4
47
- precip_u,precipitation,Precipitation (upper boom) (cumulative solid & liquid),mm,physicalMeasurement,time,TRUE,,0,,"",all,1,1,1,4
48
- precip_u_cor,precipitation_corrected,Precipitation (upper boom) (cumulative solid & liquid) – corrected,mm,modelResult,time,TRUE,L2 or later,0,,,all,0,1,1,4
49
- precip_u_rate,precipitation_rate,Precipitation rate (upper boom) (cumulative solid & liquid) – corrected,mm,modelResult,time,TRUE,L2 or later,0,,,all,0,1,1,4
50
- precip_l,precipitation,Precipitation (lower boom) (cumulative solid & liquid),mm,physicalMeasurement,time,TRUE,,0,,"",two-boom,1,1,1,4
51
- precip_l_cor,precipitation_corrected,Precipitation (lower boom) (cumulative solid & liquid) – corrected,mm,modelResult,time,TRUE,L2 or later,0,,,two-boom,0,1,1,4
52
- precip_l_rate,precipitation_rate,Precipitation rate (lower boom) (cumulative solid & liquid) – corrected,mm,modelResult,time,TRUE,L2 or later,0,,,two-boom,0,1,1,4
50
+ precip_u,precipitation_raw_upper,Semi-accumulated uncorrected liquid precipitation (upper boom),mm,physicalMeasurement,time,TRUE,L0 or L2,0,,rainfall_u,all,1,1,0,4
51
+ rainfall_u,rainfall_per_timestep_uncorrected_upper,Rainfall within timestep uncorrected for undercatch (upper boom),mm,modelResult,time,FALSE,L2 or later,0,,rainfall_cor_u,all,0,1,1,4
52
+ rainfall_cor_u,rainfall_per_timestep_corrected_upper,Rainfall within timestep corrected for undercatch (upper boom),mm,modelResult,time,FALSE,L2 or later,0,,,all,0,1,1,4
53
+ precip_l,precipitation_raw_lower,Semi-accumulated uncorrected liquid precipitation (lower boom),mm,physicalMeasurement,time,TRUE,L0 or L2,0,,rainfall_l,two-boom,1,1,0,4
54
+ rainfall_l,rainfall_per_timestep_uncorrected_lower,Rainfall within timestep uncorrected for undercatch (lower boom),mm,modelResult,time,FALSE,L2 or later,0,,rainfall_cor_l,all,0,1,1,4
55
+ rainfall_cor_l,rainfall_per_timestep_corrected_lower,Rainfall within timestep corrected for undercatch (lower boom),mm,modelResult,time,FALSE,L2 or later,0,,,all,0,1,1,4
53
56
  t_i_1,ice_temperature_at_t1,Ice temperature at sensor 1,degrees_C,physicalMeasurement,time,FALSE,,-80,1,,all,1,1,1,4
54
57
  t_i_2,ice_temperature_at_t2,Ice temperature at sensor 2,degrees_C,physicalMeasurement,time,FALSE,,-80,1,,all,1,1,1,4
55
58
  t_i_3,ice_temperature_at_t3,Ice temperature at sensor 3,degrees_C,physicalMeasurement,time,FALSE,,-80,1,,all,1,1,1,4
@@ -73,8 +76,8 @@ d_t_i_9,depth_of_thermistor_9,Depth of thermistor 9,m,modelResult,time,FALSE,L3,
73
76
  d_t_i_10,depth_of_thermistor_10,Depth of thermistor 10,m,modelResult,time,FALSE,L3,-10,100,,two-boom,0,0,1,4
74
77
  d_t_i_11,depth_of_thermistor_11,Depth of thermistor 11,m,modelResult,time,FALSE,L3,-10,100,,two-boom,0,0,1,4
75
78
  t_i_10m,10m_subsurface_temperature,10 m subsurface temperature,degrees_C,modelResult,time,FALSE,L3,-70,0,,all,0,0,1,4
76
- tilt_x,platform_view_angle_x,Tilt to east,degrees,physicalMeasurement,time,FALSE,,-30,30,"",all,1,1,1,4
77
- tilt_y,platform_view_angle_y,Tilt to north,degrees,physicalMeasurement,time,FALSE,,-30,30,"",all,1,1,1,4
79
+ tilt_x,platform_view_angle_x,Tilt to east,degrees,physicalMeasurement,time,FALSE,,-30,30,dsr_cor usr_cor,all,1,1,1,4
80
+ tilt_y,platform_view_angle_y,Tilt to north,degrees,physicalMeasurement,time,FALSE,,-30,30,dsr_cor usr_cor,all,1,1,1,4
78
81
  rot,platform_azimuth_angle,Station rotation from true North,degrees,physicalMeasurement,time,FALSE,,0,360,,all,1,1,1,2
79
82
  gps_lat,gps_latitude,Latitude,degrees_north,physicalMeasurement,time,TRUE,,50,83,,all,1,1,1,6
80
83
  gps_lon,gps_longitude,Longitude,degrees_east,physicalMeasurement,time,TRUE,,5,70,,all,1,1,1,6
@@ -95,10 +98,10 @@ fan_dc_u,fan_current,Fan current (upper boom),mA,physicalMeasurement,time,TRUE,L
95
98
  fan_dc_l,fan_current,Fan current (lower boom),mA,physicalMeasurement,time,TRUE,,0,200,,two-boom,1,1,0,2
96
99
  freq_vw,frequency_of_precipitation_wire_vibration,Frequency of vibrating wire in precipitation gauge,Hz,physicalMeasurement,time,TRUE,L0 or L2,0,10000,"",,1,1,0,
97
100
  t_log,temperature_of_logger,Logger temperature,degrees_C,physicalMeasurement,time,TRUE,,-80,40,,one-boom,1,1,0,4
98
- t_rad,temperature_of_radiation_sensor,Radiation sensor temperature,degrees_C,physicalMeasurement,time,FALSE,,-80,40,"",all,1,1,1,4
101
+ t_rad,temperature_of_radiation_sensor,Radiation sensor temperature,degrees_C,physicalMeasurement,time,FALSE,,-80,40,dlr ulr,all,1,1,1,4
99
102
  p_i,air_pressure,Air pressure (instantaneous) minus 1000,hPa,physicalMeasurement,time,TRUE,,-350,100,,all,1,1,1,4
100
- t_i,air_temperature,Air temperature (instantaneous),degrees_C,physicalMeasurement,time,TRUE,,-80,40,,all,1,1,1,4
101
- rh_i,relative_humidity,Relative humidity (instantaneous),%,physicalMeasurement,time,TRUE,,0,150,"",all,1,1,1,4
103
+ t_i,air_temperature,Air temperature (instantaneous),degrees_C,physicalMeasurement,time,TRUE,,-80,40,rh_i_wrt_ice_or_water,all,1,1,1,4
104
+ rh_i,relative_humidity,Relative humidity (instantaneous),%,physicalMeasurement,time,TRUE,,0,150,rh_i_wrt_ice_or_water,all,1,1,1,4
102
105
  rh_i_wrt_ice_or_water,relative_humidity_with_respect_to_ice_or_water,Relative humidity (instantaneous) with respect to saturation over ice in subfreezing conditions and over water otherwise,%,modelResult,time,TRUE,L2 or later,0,100,,all,0,1,1,4
103
106
  wspd_i,wind_speed,Wind speed (instantaneous),m s-1,physicalMeasurement,time,TRUE,,0,100,wdir_i wspd_x_i wspd_y_i,all,1,1,1,4
104
107
  wdir_i,wind_from_direction,Wind from direction (instantaneous),degrees,physicalMeasurement,time,TRUE,,1,360,wspd_x_i wspd_y_i,all,1,1,1,4
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pypromice
3
- Version: 1.5.3
3
+ Version: 1.6.0
4
4
  Summary: PROMICE/GC-Net data processing toolbox
5
5
  Home-page: https://github.com/GEUS-Glaciology-and-Climate/pypromice
6
6
  Author: GEUS Glaciology and Climate
@@ -25,7 +25,6 @@ Requires-Dist: toml
25
25
  Requires-Dist: scipy>=1.9.0
26
26
  Requires-Dist: Bottleneck
27
27
  Requires-Dist: netcdf4
28
- Requires-Dist: pyDataverse==0.3.1
29
28
  Requires-Dist: eccodes
30
29
  Requires-Dist: scikit-learn>=1.1.0
31
30
  Dynamic: author
@@ -0,0 +1,64 @@
1
+ pypromice/__init__.py,sha256=X2LaniNJv4iVYqRtmf2jyGMQLaj59bIgkhlWhT6LCgQ,74
2
+ pypromice/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ pypromice/core/dependency_graph.py,sha256=bqoXasC8pg5ipjBd6rqDhfHwIq11t2_cFlNT72ncw4w,3135
4
+ pypromice/core/qc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ pypromice/core/qc/github_data_issues.py,sha256=gbbF62oMMWbXiLnsrs60vXbwfAqSUP113plhidVeqCU,13353
6
+ pypromice/core/qc/persistence.py,sha256=Y9CmAAPHNqEjdsZW4LEAVm7cnMEBK-zwEAD_UBDASVw,6466
7
+ pypromice/core/qc/value_clipping.py,sha256=KGLLN54-QeD4TQ-Dd-NeooYG3kdEC6SPhz4LT2ZsRi4,1533
8
+ pypromice/core/qc/percentiles/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ pypromice/core/qc/percentiles/compute_thresholds.py,sha256=jHk1hAvm168ViORIwDOZHm4MAxQTtvseo_43-P3mtoY,6096
10
+ pypromice/core/qc/percentiles/outlier_detector.py,sha256=5_458aMm9MAubfYv7oIz1Lp9ME6Sn1xiSiAQmIe-riY,3370
11
+ pypromice/core/qc/percentiles/thresholds.csv,sha256=KTQcYsg2VCZmR-Rf1Zzx1Jn-ZmR5yPPWWXYZ0Z03PDQ,9516
12
+ pypromice/core/variables/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
13
+ pypromice/core/variables/air_temperature.py,sha256=TS_0kGC98pbSe7DlAl6W_E5AzGslgRNlIiskyIjA07c,2025
14
+ pypromice/core/variables/gps.py,sha256=YCS1OeQ8f2Rel32kiZ_UH-kNlRLlaakKKMPjaCAvO-I,7615
15
+ pypromice/core/variables/humidity.py,sha256=TfQfGbQ0gyj_A9zRChGei47oZYMRAR13eIzjkQ3kfD4,3775
16
+ pypromice/core/variables/precipitation.py,sha256=iH7m1sJDwbstZuAutO2HCRVo3RqaSuDG33YERBtvQag,3467
17
+ pypromice/core/variables/pressure_transducer_depth.py,sha256=SadI_8oRKmMI2dnsYfYDJD7AnE6-i1bv0MOmO5xms8E,2418
18
+ pypromice/core/variables/radiation.py,sha256=11iGl2cq5WGJxnPwTAy3H4Y5bU-QXTaMaEife1BPNA0,14318
19
+ pypromice/core/variables/station_boom_height.py,sha256=5bomhyXLSlBhcL9EaMInkcriNeatuvnUqu98hX-0n0s,1317
20
+ pypromice/core/variables/station_pose.py,sha256=3aVb8hywsFBCDorgHPW_nNdf_pyyil6ziJsP3UBhje4,13112
21
+ pypromice/core/variables/wind.py,sha256=-dpaBOtqGyPDIU4O1HbbWRzlLNRC2a50OdnZhIaWdeI,1701
22
+ pypromice/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ pypromice/io/make_metadata_csv.py,sha256=lUw8fZC6dzG10IePZ4d7eZIrTbquHYCDuppYP4r_dF0,9776
24
+ pypromice/io/write.py,sha256=D-u7WuSlD18B9Y-_qB_AuuXRNoUkDsRPhXibUnVJzJo,15819
25
+ pypromice/io/bufr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ pypromice/io/bufr/bufr_to_csv.py,sha256=YhvtK3Rbya8ulpjeCaMyPQ_luNOmRqR_3XkzuyIvaWg,503
27
+ pypromice/io/bufr/bufr_utilities.py,sha256=O1vnpKipUC6nMPmSrPvWECJocjdsB9FAb2ILXD8b8fs,21264
28
+ pypromice/io/bufr/create_bufr_files.py,sha256=hN5UzBuj1kRk_kgwWiE0H9JaYTC3G5DjvenZGCJs6CY,5661
29
+ pypromice/io/bufr/get_bufr.py,sha256=Yy3w9U-s29Xkfs6zNsyKTV9HHCEA_Mc31jRw3A4_BHM,16705
30
+ pypromice/io/bufr/positions_seed.csv,sha256=0kVCQ8UfEALdeXNYCddmwxpseRqLRudbFStqp_bZRBw,224
31
+ pypromice/io/bufr/real_time_utilities.py,sha256=HfLPDW6rS0D2CXr4yJeyRxZxHUm0yA337vYRbb8_l7A,9490
32
+ pypromice/io/bufr/station_configuration.py,sha256=h0ap21-dCeU9kboktgYeziGvcni4OoJBi82fStV3se0,4009
33
+ pypromice/io/ingest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
+ pypromice/io/ingest/git.py,sha256=GcMdsZT2Dr6lTHDtlTLH5ueCUMMHytktgeOy6hX9YDw,1774
35
+ pypromice/io/ingest/l0.py,sha256=1Dmz3wpMcK3nSmf2ENMrPm-aoTqTgsng5gkr4CdWyq4,9011
36
+ pypromice/io/ingest/l0_repository.py,sha256=jmlQMSETj9aBA1iOC9sPl4-ia9UfsRHTWiR0VisZt90,3552
37
+ pypromice/io/ingest/toa5.py,sha256=GiDCUMJpvbTRs0PzU1wz6uPkYkih9XjDVPcGbl__RtU,2857
38
+ pypromice/pipeline/L0toL1.py,sha256=g_pH9sVPJMfYKdFgJpT7WW5rqJntJPKsxpw9N_nKs-o,13816
39
+ pypromice/pipeline/L1toL2.py,sha256=lNSC3QOQf-ZZpFlCW6PFeRIkWtGWlDMBXWzNBU2yKAc,10158
40
+ pypromice/pipeline/L2toL3.py,sha256=zDJggJMojKtK1VPkWoQBEgUNBbm02b2-xR-ajW2E3tg,60846
41
+ pypromice/pipeline/__init__.py,sha256=yqYenngaSNFtpnAsfc953142P84ocq3ykvlsCIbsw3g,151
42
+ pypromice/pipeline/aws.py,sha256=5Xv7XVf5PvcSAnEu_jPpjDWV4U0p_UvdpOzCtmH0ICU,5092
43
+ pypromice/pipeline/get_l2.py,sha256=VV4iV3P34HFSOi3jr0IQrNXjBMgCx5GpF0uwNbT84Ck,3072
44
+ pypromice/pipeline/get_l2tol3.py,sha256=RLyyV2iCqCXInc91sMgxltTmAD8hAt6NU3-meIR9kac,4497
45
+ pypromice/pipeline/join_l2.py,sha256=AQL9wVqRFbdB6bevuOArg9knZCv-jDVwypMETjuDqBM,4561
46
+ pypromice/pipeline/join_l3.py,sha256=Wd5slBCo1XgzExOjPu9IRLWnk7NJMTwDcckhithvw0E,20316
47
+ pypromice/pipeline/resample.py,sha256=SMq9Rh-Uy6DbtQdDv062t3n-AChRHx_J3AR914sMkLc,8099
48
+ pypromice/pipeline/utilities.py,sha256=m-BaHWMKBGzTHa09w-49yqWRulXex5TTScg7IZu8fSY,1248
49
+ pypromice/resources/__init__.py,sha256=MpKmvV11R4tcqmyvJpXQt-_It3oRI0WEIQNbMST--4w,907
50
+ pypromice/resources/file_attributes.csv,sha256=ISKR-Ax12CT9tQD38ByNyvWPLLpMszpWXwviPyhuUaI,7018
51
+ pypromice/resources/variable_aliases_GC-Net.csv,sha256=ts10e0AI1Fz_TtEj8qdRFIZBTkE8pt_VtJGp5hSBUBI,993
52
+ pypromice/resources/variables.csv,sha256=gUmA37r_k9JEP5Tvog3gUC6lROwz-w9DfX0FW3RA-FQ,14166
53
+ pypromice/tx/__init__.py,sha256=-62bhHWJGfzFh5JwHcLqRj2jcGzmqzYOLWByhO706YY,30
54
+ pypromice/tx/get_l0tx.py,sha256=b34-96KGshTyTN2tBFaAIBl7oZZzbRB_JR7sXtDNfXA,6957
55
+ pypromice/tx/get_msg.py,sha256=OGS60OHjy4Wf8JExTfOdK-9xhjFdjhuChxoTSPe_MjI,3417
56
+ pypromice/tx/payload_formats.csv,sha256=A46-XcYdpe9-gzmADylP2UVizLi_UphF-BPT5u3Lyn8,7903
57
+ pypromice/tx/payload_types.csv,sha256=C1-xCmHytAqqAzgzPwBLWqabzWu6s6tKAd8AjVd935s,457
58
+ pypromice/tx/tx.py,sha256=asbgXVI5vurKM-WVACTfpKRt-70wtzVvSbvjvYufajI,34416
59
+ pypromice-1.6.0.dist-info/licenses/LICENSE.txt,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
60
+ pypromice-1.6.0.dist-info/METADATA,sha256=9Y4jNegT_VKzN0dQdqFSvOWcLSONdsva-tNfvG5qiB0,4958
61
+ pypromice-1.6.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
62
+ pypromice-1.6.0.dist-info/entry_points.txt,sha256=aU2SG5A0wI2n4HE9fotG-y5yeIqJ0G1-8UrEgr1GUQk,535
63
+ pypromice-1.6.0.dist-info/top_level.txt,sha256=cBdfwgSbWDQq3a07nKRjrfmLC7jdaYXs98GG58HpTks,10
64
+ pypromice-1.6.0.dist-info/RECORD,,
@@ -0,0 +1,12 @@
1
+ [console_scripts]
2
+ bufr_to_csv = pypromice.pio.bufr.bufr_to_csv:main
3
+ create_bufr_files = pypromice.io.bufr.create_bufr_files:main
4
+ get_bufr = pypromice.io.bufr.get_bufr:main
5
+ get_l0tx = pypromice.tx.get_l0tx:get_l0tx
6
+ get_l2 = pypromice.pipeline.get_l2:main
7
+ get_l2tol3 = pypromice.pipeline.get_l2tol3:main
8
+ get_msg = pypromice.tx.get_msg:get_msg
9
+ get_watsontx = pypromice.tx.get_watsontx:get_watsontx
10
+ join_l2 = pypromice.pipeline.join_l2:main
11
+ join_l3 = pypromice.pipeline.join_l3:main
12
+ make_metadata_csv = pypromice.io.make_metadata_csv:main
pypromice/get/__init__.py DELETED
@@ -1 +0,0 @@
1
- from pypromice.get.get import *