@@ -488,3 +488,50 @@ def rosette_summary(fname):
488
488
ros ["nbf" ] = ros ["nbf" ].astype (int )
489
489
ros .set_index ("nbf" , drop = True , inplace = True , verify_integrity = False )
490
490
return ros
491
+
492
+
493
+ def from_castaway_csv (fname ):
494
+ """
495
+ DataFrame constructor to open CastAway CSV format.
496
+
497
+ Example
498
+ --------
499
+ >>> import ctd
500
+ >>> cast = ctd.from_castaway_csv('tests/data/castaway_data.csv')
501
+ >>> downcast, upcast = cast.split() # Upcast often prefiltered
502
+ >>> fig, ax = plt.subplots()
503
+ >>> ax = downcast['temperature'].plot_cast()
504
+ >>> fig.show()
505
+
506
+ """
507
+ with open (fname ) as file :
508
+ f = file .readlines ()
509
+
510
+ # Strip newline characters
511
+ f = [s .strip () for s in f ]
512
+
513
+ # Separate meta data and CTD profile
514
+ meta = [s for s in f if s [0 ] == "%" ][0 :- 1 ]
515
+ data = [s .split ("," ) for s in f if s [0 ] != "%" ]
516
+ df = pd .DataFrame (data [1 :- 1 ], columns = data [0 ])
517
+
518
+ # Convert to numeric
519
+ for col in df .columns :
520
+ df [col ] = pd .to_numeric (df [col ])
521
+
522
+ # Normalise column names and extract units
523
+ units = [s [s .find ("(" ) + 1 : s .find (")" )] for s in df .columns ]
524
+ df .columns = [
525
+ _normalize_names (s .split ("(" )[0 ]).lower ().replace (" " , "_" ) for s in df .columns
526
+ ]
527
+ df .set_index ("pressure" , drop = True , inplace = True , verify_integrity = False )
528
+
529
+ # Add metadata
530
+ meta = [s .replace ("%" , "" ).strip ().split ("," ) for s in meta ]
531
+ metadata = {}
532
+ for line in meta :
533
+ metadata [line [0 ]] = line [1 ]
534
+ metadata ["units" ] = units
535
+ setattr (df , "_metadata" , metadata )
536
+
537
+ return df
0 commit comments