@@ -296,40 +296,45 @@ def reshape_dataset(ds):
296
296
# Create integer "Site" identifier based on SiteCode / IAGA_code
297
297
sites = dict (enumerate (sorted (set (ds [codevar ].values ))))
298
298
sites_inv = {v : k for k , v in sites .items ()}
299
- # Identify (V)OBS locations and mapping from integer "Site" identifier
300
- pos_vars = ["Longitude" , "Latitude" , "Radius" , codevar ]
301
- _ds_locs = next (iter (ds [pos_vars ].groupby ("Timestamp" )))[1 ]
302
- if len (sites ) > 1 :
303
- _ds_locs = _ds_locs .drop (("Timestamp" )).rename ({"Timestamp" : "Site" })
299
+ if len (sites ) == 0 :
300
+ _ds_locs = ds
304
301
else :
305
- _ds_locs = _ds_locs .drop (("Timestamp" )).expand_dims ("Site" )
306
- _ds_locs ["Site" ] = [sites_inv .get (code ) for code in _ds_locs [codevar ].values ]
307
- _ds_locs = _ds_locs .sortby ("Site" )
302
+ # Identify (V)OBS locations and mapping from integer "Site" identifier
303
+ pos_vars = ["Longitude" , "Latitude" , "Radius" , codevar ]
304
+ _ds_locs = next (iter (ds [pos_vars ].groupby ("Timestamp" )))[1 ]
305
+ if len (sites ) > 1 :
306
+ _ds_locs = _ds_locs .drop (("Timestamp" )).rename ({"Timestamp" : "Site" })
307
+ else :
308
+ _ds_locs = _ds_locs .drop (("Timestamp" )).expand_dims ("Site" )
309
+ _ds_locs ["Site" ] = [sites_inv .get (code ) for code in _ds_locs [codevar ].values ]
310
+ _ds_locs = _ds_locs .sortby ("Site" )
308
311
# Create dataset initialised with the (V)OBS positional info as coords
309
312
# and datavars (empty) reshaped to (Site, Timestamp, ...)
310
313
t = numpy .unique (ds ["Timestamp" ])
311
314
ds2 = xarray .Dataset (
312
315
coords = {
313
316
"Timestamp" : t ,
314
- codevar : (("Site" ), _ds_locs [codevar ]),
315
- "Latitude" : ("Site" , _ds_locs ["Latitude" ]),
316
- "Longitude" : ("Site" , _ds_locs ["Longitude" ]),
317
- "Radius" : ("Site" , _ds_locs ["Radius" ]),
317
+ codevar : (("Site" ), _ds_locs [codevar ]. data ),
318
+ "Latitude" : ("Site" , _ds_locs ["Latitude" ]. data ),
319
+ "Longitude" : ("Site" , _ds_locs ["Longitude" ]. data ),
320
+ "Radius" : ("Site" , _ds_locs ["Radius" ]. data ),
318
321
"NEC" : ["N" , "E" , "C" ]
319
322
},
320
323
)
321
324
# (Dropping unused Spacecraft var)
322
325
data_vars = set (ds .data_vars ) - {"Latitude" , "Longitude" , "Radius" , codevar , "Spacecraft" }
323
326
N_sites = len (_ds_locs [codevar ])
327
+ # Create empty data variables to be infilled
324
328
for var in data_vars :
325
329
shape = [N_sites , len (t ), * ds [var ].shape [1 :]]
326
330
ds2 [var ] = ("Site" , * ds [var ].dims ), numpy .empty (shape , dtype = ds [var ].dtype )
327
331
ds2 [var ][...] = None
328
- # Loop through each (V)OBS site to insert the datavars into ds2
329
- for k , _ds in dict (ds .groupby (codevar )).items ():
330
- site = sites_inv .get (k )
331
- for var in data_vars :
332
- ds2 [var ][site , ...] = _ds [var ].values
332
+ # Loop through each (V)OBS site to infill the data
333
+ if N_sites != 0 :
334
+ for k , _ds in dict (ds .groupby (codevar )).items ():
335
+ site = sites_inv .get (k )
336
+ for var in data_vars :
337
+ ds2 [var ][site , ...] = _ds [var ].values
333
338
# Revert to using only the "SiteCode"/"IAGA_code" identifier
334
339
ds2 = ds2 .set_index ({"Site" : codevar })
335
340
ds2 = ds2 .rename ({"Site" : codevar })
0 commit comments