# HG changeset patch # User ecology # Date 1659302601 0 # Node ID 810820a0d45c4228d245a743c237c26ef3d4a80b planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/data_manipulation/xarray/ commit fd8ad4d97db7b1fd3876ff63e14280474e06fdf7 diff -r 000000000000 -r 810820a0d45c macros.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/macros.xml Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,28 @@ + + 2022.3.0 + 0 + 20.05 + + + topic_0610 + topic_3050 + + + + + + @article{hoyer2017xarray, + title = {xarray: {N-D} labeled arrays and datasets in {Python}}, + author = {Hoyer, S. and J. Hamman}, + journal = {Journal of Open Research Software}, + volume = {5}, + number = {1}, + year = {2017}, + publisher = {Ubiquity Press}, + doi = {10.5334/jors.148}, + url = {http://doi.org/10.5334/jors.148} + } + + + + diff -r 000000000000 -r 810820a0d45c macros_mapplot.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/macros_mapplot.xml Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 000000000000 -r 810820a0d45c macros_netcdf2netcdf.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/macros_netcdf2netcdf.xml Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + +
+
+
diff -r 000000000000 -r 810820a0d45c macros_tests_netcdf2netcdf.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/macros_tests_netcdf2netcdf.xml Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,263 @@ + + + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +
+ +
+ + + +
+ +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ + + + + +
+ +
+ + + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+
diff -r 000000000000 -r 810820a0d45c macros_timeseries.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/macros_timeseries.xml Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,47 @@ + + + + + + + + + diff -r 000000000000 -r 810820a0d45c test-data/Metadata_infos_from_dataset-ibi-reanalysis-bio-005-003-monthly-regulargrid_1510914389133.nc.Variables.tab --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/Metadata_infos_from_dataset-ibi-reanalysis-bio-005-003-monthly-regulargrid_1510914389133.nc.Variables.tab Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,8 @@ +VariableName NumberOfDimensions Dim0Name Dim0Size Dim1Name Dim1Size Dim2Name Dim2Size Dim3Name Dim3Size +phy 4 time 145 depth 1 latitude 97 longitude 103 +chl 4 time 145 depth 1 latitude 97 longitude 103 +nh4 4 time 145 depth 1 latitude 97 longitude 103 +time 1 time 145 +longitude 1 longitude 103 +latitude 1 latitude 97 +depth 1 depth 1 diff -r 000000000000 -r 810820a0d45c test-data/Test1.tabular --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/Test1.tabular Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,146 @@ + time depth longitude latitude phy +0 2002-12-15 0.5057600140571594 -2.0000007 44.0 1.0500183 +1 2003-01-15 0.5057600140571594 -2.0000007 44.0 1.25 +2 2003-02-15 0.5057600140571594 -2.0000007 44.0 1.3000183 +3 2003-03-15 0.5057600140571594 -2.0000007 44.0 6.0599976 +4 2003-04-15 0.5057600140571594 -2.0000007 44.0 2.25 +5 2003-05-15 0.5057600140571594 -2.0000007 44.0 0.6499939 +6 2003-06-15 0.5057600140571594 -2.0000007 44.0 0.42999268 +7 2003-07-15 0.5057600140571594 -2.0000007 44.0 0.42999268 +8 2003-08-15 0.5057600140571594 -2.0000007 44.0 0.480011 +9 2003-09-15 0.5057600140571594 -2.0000007 44.0 0.45999146 +10 2003-10-15 0.5057600140571594 -2.0000007 44.0 0.5 +11 2003-11-15 0.5057600140571594 -2.0000007 44.0 0.9299927 +12 2003-12-15 0.5057600140571594 -2.0000007 44.0 1.3900146 +13 2004-01-15 0.5057600140571594 -2.0000007 44.0 1.7400208 +14 2004-02-15 0.5057600140571594 -2.0000007 44.0 4.5 +15 2004-03-15 0.5057600140571594 -2.0000007 44.0 5.5500183 +16 2004-04-15 0.5057600140571594 -2.0000007 44.0 5.3099976 +17 2004-05-15 0.5057600140571594 -2.0000007 44.0 3.75 +18 2004-06-15 0.5057600140571594 -2.0000007 44.0 0.77001953 +19 2004-07-15 0.5057600140571594 -2.0000007 44.0 0.5 +20 2004-08-15 0.5057600140571594 -2.0000007 44.0 0.45999146 +21 2004-09-15 0.5057600140571594 -2.0000007 44.0 0.4500122 +22 2004-10-15 0.5057600140571594 -2.0000007 44.0 0.480011 +23 2004-11-15 0.5057600140571594 -2.0000007 44.0 0.83999634 +24 2004-12-15 0.5057600140571594 -2.0000007 44.0 1.7400208 +25 2005-01-15 0.5057600140571594 -2.0000007 44.0 1.7700195 +26 2005-02-15 0.5057600140571594 -2.0000007 44.0 1.5500183 +27 2005-03-15 0.5057600140571594 -2.0000007 44.0 7.149994 +28 2005-04-15 0.5057600140571594 -2.0000007 44.0 3.649994 +29 2005-05-15 0.5057600140571594 -2.0000007 44.0 2.5200195 +30 2005-06-15 0.5057600140571594 -2.0000007 44.0 0.45999146 +31 2005-07-15 0.5057600140571594 -2.0000007 44.0 0.6700134 +32 2005-08-15 0.5057600140571594 -2.0000007 44.0 0.4500122 +33 2005-09-15 0.5057600140571594 -2.0000007 44.0 0.45999146 +34 2005-10-15 0.5057600140571594 -2.0000007 44.0 0.45999146 +35 2005-11-15 0.5057600140571594 -2.0000007 44.0 0.6199951 +36 2005-12-15 0.5057600140571594 -2.0000007 44.0 1.1499939 +37 2006-01-15 0.5057600140571594 -2.0000007 44.0 3.5299988 +38 2006-02-15 0.5057600140571594 -2.0000007 44.0 7.1799927 +39 2006-03-15 0.5057600140571594 -2.0000007 44.0 6.5599976 +40 2006-04-15 0.5057600140571594 -2.0000007 44.0 3.8000183 +41 2006-05-15 0.5057600140571594 -2.0000007 44.0 0.95999146 +42 2006-06-15 0.5057600140571594 -2.0000007 44.0 1.5 +43 2006-07-15 0.5057600140571594 -2.0000007 44.0 1.0299988 +44 2006-08-15 0.5057600140571594 -2.0000007 44.0 0.480011 +45 2006-09-15 0.5057600140571594 -2.0000007 44.0 0.49002075 +46 2006-10-15 0.5057600140571594 -2.0000007 44.0 0.480011 +47 2006-11-15 0.5057600140571594 -2.0000007 44.0 0.9299927 +48 2006-12-15 0.5057600140571594 -2.0000007 44.0 1.2099915 +49 2007-01-15 0.5057600140571594 -2.0000007 44.0 1.1499939 +50 2007-02-15 0.5057600140571594 -2.0000007 44.0 1.7000122 +51 2007-03-15 0.5057600140571594 -2.0000007 44.0 5.230011 +52 2007-04-15 0.5057600140571594 -2.0000007 44.0 3.8600159 +53 2007-05-15 0.5057600140571594 -2.0000007 44.0 0.83999634 +54 2007-06-15 0.5057600140571594 -2.0000007 44.0 0.6799927 +55 2007-07-15 0.5057600140571594 -2.0000007 44.0 0.45999146 +56 2007-08-15 0.5057600140571594 -2.0000007 44.0 0.45999146 +57 2007-09-15 0.5057600140571594 -2.0000007 44.0 0.5 +58 2007-10-15 0.5057600140571594 -2.0000007 44.0 0.89001465 +59 2007-11-15 0.5057600140571594 -2.0000007 44.0 2.0299988 +60 2007-12-15 0.5057600140571594 -2.0000007 44.0 1.8399963 +61 2008-01-15 0.5057600140571594 -2.0000007 44.0 1.3399963 +62 2008-02-15 0.5057600140571594 -2.0000007 44.0 3.149994 +63 2008-03-15 0.5057600140571594 -2.0000007 44.0 4.5899963 +64 2008-04-15 0.5057600140571594 -2.0000007 44.0 5.080017 +65 2008-05-15 0.5057600140571594 -2.0000007 44.0 1.0 +66 2008-06-15 0.5057600140571594 -2.0000007 44.0 1.5299988 +67 2008-07-15 0.5057600140571594 -2.0000007 44.0 0.55999756 +68 2008-08-15 0.5057600140571594 -2.0000007 44.0 0.42999268 +69 2008-09-15 0.5057600140571594 -2.0000007 44.0 0.42999268 +70 2008-10-15 0.5057600140571594 -2.0000007 44.0 0.42999268 +71 2008-11-15 0.5057600140571594 -2.0000007 44.0 0.64001465 +72 2008-12-15 0.5057600140571594 -2.0000007 44.0 2.4200134 +73 2009-01-15 0.5057600140571594 -2.0000007 44.0 2.3900146 +74 2009-02-15 0.5057600140571594 -2.0000007 44.0 6.2099915 +75 2009-03-15 0.5057600140571594 -2.0000007 44.0 4.6799927 +76 2009-04-15 0.5057600140571594 -2.0000007 44.0 1.1100159 +77 2009-05-15 0.5057600140571594 -2.0000007 44.0 2.649994 +78 2009-06-15 0.5057600140571594 -2.0000007 44.0 1.4900208 +79 2009-07-15 0.5057600140571594 -2.0000007 44.0 0.5 +80 2009-08-15 0.5057600140571594 -2.0000007 44.0 0.45999146 +81 2009-09-15 0.5057600140571594 -2.0000007 44.0 0.5800171 +82 2009-10-15 0.5057600140571594 -2.0000007 44.0 0.6499939 +83 2009-11-15 0.5057600140571594 -2.0000007 44.0 0.8999939 +84 2009-12-15 0.5057600140571594 -2.0000007 44.0 1.3099976 +85 2010-01-15 0.5057600140571594 -2.0000007 44.0 1.5299988 +86 2010-02-15 0.5057600140571594 -2.0000007 44.0 2.9599915 +87 2010-03-15 0.5057600140571594 -2.0000007 44.0 5.450012 +88 2010-04-15 0.5057600140571594 -2.0000007 44.0 7.5899963 +89 2010-05-15 0.5057600140571594 -2.0000007 44.0 1.8000183 +90 2010-06-15 0.5057600140571594 -2.0000007 44.0 0.480011 +91 2010-07-15 0.5057600140571594 -2.0000007 44.0 0.5 +92 2010-08-15 0.5057600140571594 -2.0000007 44.0 0.45999146 +93 2010-09-15 0.5057600140571594 -2.0000007 44.0 0.49002075 +94 2010-10-15 0.5057600140571594 -2.0000007 44.0 0.45999146 +95 2010-11-15 0.5057600140571594 -2.0000007 44.0 0.9299927 +96 2010-12-15 0.5057600140571594 -2.0000007 44.0 1.1499939 +97 2011-01-15 0.5057600140571594 -2.0000007 44.0 2.4900208 +98 2011-02-15 0.5057600140571594 -2.0000007 44.0 5.1799927 +99 2011-03-15 0.5057600140571594 -2.0000007 44.0 7.029999 +100 2011-04-15 0.5057600140571594 -2.0000007 44.0 2.4900208 +101 2011-05-15 0.5057600140571594 -2.0000007 44.0 0.6499939 +102 2011-06-15 0.5057600140571594 -2.0000007 44.0 0.52001953 +103 2011-07-15 0.5057600140571594 -2.0000007 44.0 0.5 +104 2011-08-15 0.5057600140571594 -2.0000007 44.0 0.75 +105 2011-09-15 0.5057600140571594 -2.0000007 44.0 0.45999146 +106 2011-10-15 0.5057600140571594 -2.0000007 44.0 0.480011 +107 2011-11-15 0.5057600140571594 -2.0000007 44.0 0.730011 +108 2011-12-15 0.5057600140571594 -2.0000007 44.0 1.0299988 +109 2012-01-15 0.5057600140571594 -2.0000007 44.0 3.149994 +110 2012-02-15 0.5057600140571594 -2.0000007 44.0 2.3099976 +111 2012-03-15 0.5057600140571594 -2.0000007 44.0 5.5200195 +112 2012-04-15 0.5057600140571594 -2.0000007 44.0 3.399994 +113 2012-05-15 0.5057600140571594 -2.0000007 44.0 3.7000122 +114 2012-06-15 0.5057600140571594 -2.0000007 44.0 2.5899963 +115 2012-07-15 0.5057600140571594 -2.0000007 44.0 0.45999146 +116 2012-08-15 0.5057600140571594 -2.0000007 44.0 0.4500122 +117 2012-09-15 0.5057600140571594 -2.0000007 44.0 0.45999146 +118 2012-10-15 0.5057600140571594 -2.0000007 44.0 0.61001587 +119 2012-11-15 0.5057600140571594 -2.0000007 44.0 2.0299988 +120 2012-12-15 0.5057600140571594 -2.0000007 44.0 1.4200134 +121 2013-01-15 0.5057600140571594 -2.0000007 44.0 2.2700195 +122 2013-02-15 0.5057600140571594 -2.0000007 44.0 7.0 +123 2013-03-15 0.5057600140571594 -2.0000007 44.0 10.550018 +124 2013-04-15 0.5057600140571594 -2.0000007 44.0 5.8399963 +125 2013-05-15 0.5057600140571594 -2.0000007 44.0 1.2400208 +126 2013-06-15 0.5057600140571594 -2.0000007 44.0 4.1700134 +127 2013-07-15 0.5057600140571594 -2.0000007 44.0 3.2099915 +128 2013-08-15 0.5057600140571594 -2.0000007 44.0 0.45999146 +129 2013-09-15 0.5057600140571594 -2.0000007 44.0 0.480011 +130 2013-10-15 0.5057600140571594 -2.0000007 44.0 0.49002075 +131 2013-11-15 0.5057600140571594 -2.0000007 44.0 0.7799988 +132 2013-12-15 0.5057600140571594 -2.0000007 44.0 1.4500122 +133 2014-01-15 0.5057600140571594 -2.0000007 44.0 0.95999146 +134 2014-02-15 0.5057600140571594 -2.0000007 44.0 1.3900146 +135 2014-03-15 0.5057600140571594 -2.0000007 44.0 5.779999 +136 2014-04-15 0.5057600140571594 -2.0000007 44.0 5.4299927 +137 2014-05-15 0.5057600140571594 -2.0000007 44.0 1.1799927 +138 2014-06-15 0.5057600140571594 -2.0000007 44.0 0.730011 +139 2014-07-15 0.5057600140571594 -2.0000007 44.0 0.45999146 +140 2014-08-15 0.5057600140571594 -2.0000007 44.0 0.45999146 +141 2014-09-15 0.5057600140571594 -2.0000007 44.0 0.5 +142 2014-10-15 0.5057600140571594 -2.0000007 44.0 0.6199951 +143 2014-11-15 0.5057600140571594 -2.0000007 44.0 0.480011 +144 2014-12-15 0.5057600140571594 -2.0000007 44.0 0.55999756 diff -r 000000000000 -r 810820a0d45c test-data/Test2.tabular --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/Test2.tabular Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,25 @@ + time depth latitude longitude nh4 +0 2003-12-15 0.5057600140571594 45.166664123535156 -0.6666674017906189 81.27 +1 2003-12-15 0.5057600140571594 45.416664123535156 -0.8333340883255005 78.08 +2 2003-12-15 0.5057600140571594 45.5 -0.9166674017906189 55.149998 +3 2004-01-15 0.5057600140571594 45.166664123535156 -0.6666674017906189 65.2 +4 2004-01-15 0.5057600140571594 45.416664123535156 -0.8333340883255005 64.11 +5 2004-02-15 0.5057600140571594 45.166664123535156 -0.6666674017906189 51.0 +6 2004-02-15 0.5057600140571594 45.416664123535156 -0.8333340883255005 51.32 +7 2004-05-15 0.5057600140571594 45.166664123535156 -0.6666674017906189 54.53 +8 2004-06-15 0.5057600140571594 45.166664123535156 -0.6666674017906189 79.79 +9 2004-06-15 0.5057600140571594 45.416664123535156 -0.8333340883255005 61.52 +10 2004-07-15 0.5057600140571594 45.166664123535156 -0.6666674017906189 99.159996 +11 2004-07-15 0.5057600140571594 45.416664123535156 -0.8333340883255005 77.93 +12 2004-08-15 0.5057600140571594 45.166664123535156 -0.6666674017906189 110.149994 +13 2004-08-15 0.5057600140571594 45.416664123535156 -0.8333340883255005 86.759995 +14 2004-09-15 0.5057600140571594 45.166664123535156 -0.6666674017906189 112.369995 +15 2004-09-15 0.5057600140571594 45.416664123535156 -0.8333340883255005 91.979996 +16 2004-10-15 0.5057600140571594 45.166664123535156 -0.6666674017906189 109.63 +17 2004-10-15 0.5057600140571594 45.416664123535156 -0.8333340883255005 95.509995 +18 2004-11-15 0.5057600140571594 45.166664123535156 -0.6666674017906189 98.45 +19 2004-11-15 0.5057600140571594 45.416664123535156 -0.8333340883255005 93.11 +20 2004-11-15 0.5057600140571594 45.5 -0.9166674017906189 56.78 +21 2004-12-15 0.5057600140571594 45.166664123535156 -0.6666674017906189 84.25 +22 2004-12-15 0.5057600140571594 45.416664123535156 -0.8333340883255005 81.83 +23 2004-12-15 0.5057600140571594 45.5 -0.9166674017906189 57.07 diff -r 000000000000 -r 810820a0d45c test-data/all.netcdf Binary file test-data/all.netcdf has changed diff -r 000000000000 -r 810820a0d45c test-data/chl_alltimes.nc Binary file test-data/chl_alltimes.nc has changed diff -r 000000000000 -r 810820a0d45c test-data/chl_nh4.netcdf Binary file test-data/chl_nh4.netcdf has changed diff -r 000000000000 -r 810820a0d45c test-data/chl_phy_where.netcdf Binary file test-data/chl_phy_where.netcdf has changed diff -r 000000000000 -r 810820a0d45c test-data/chl_where_drop.netcdf Binary file test-data/chl_where_drop.netcdf has changed diff -r 000000000000 -r 810820a0d45c test-data/data_from_20040615.nc Binary file test-data/data_from_20040615.nc has changed diff -r 000000000000 -r 810820a0d45c test-data/data_to_20040615.nc Binary file test-data/data_to_20040615.nc has changed diff -r 000000000000 -r 810820a0d45c test-data/dataset-ibi-reanalysis-bio-005-003-monthly-regulargrid_1510914389133.nc Binary file test-data/dataset-ibi-reanalysis-bio-005-003-monthly-regulargrid_1510914389133.nc has changed diff -r 000000000000 -r 810820a0d45c test-data/dataset-ibi-reanalysis-bio-005-003-monthly-regulargrid_1510914389133_time0.png Binary file test-data/dataset-ibi-reanalysis-bio-005-003-monthly-regulargrid_1510914389133_time0.png has changed diff -r 000000000000 -r 810820a0d45c test-data/dataset-ibi-reanalysis-bio-005-003-monthly-regulargrid_1510914389133_time0_title.png Binary file test-data/dataset-ibi-reanalysis-bio-005-003-monthly-regulargrid_1510914389133_time0_title.png has changed diff -r 000000000000 -r 810820a0d45c test-data/dataset-ibi-reanalysis-bio-005-003-monthly-regulargrid_1510914389133_time1.png Binary file test-data/dataset-ibi-reanalysis-bio-005-003-monthly-regulargrid_1510914389133_time1.png has changed diff -r 000000000000 -r 810820a0d45c test-data/dataset-ibi-reanalysis-bio-005-003-monthly-regulargrid_1510914389133_time50.png Binary file test-data/dataset-ibi-reanalysis-bio-005-003-monthly-regulargrid_1510914389133_time50.png has changed diff -r 000000000000 -r 810820a0d45c test-data/depth.tabular --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/depth.tabular Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,1 @@ +0 0.50576 diff -r 000000000000 -r 810820a0d45c test-data/info_file.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/info_file.txt Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,74 @@ +xarray.Dataset { +dimensions: + time = 145 ; + depth = 1 ; + latitude = 97 ; + longitude = 103 ; + +variables: + float32 phy(time, depth, latitude, longitude) ; + phy:_CoordinateAxes = time depth latitude longitude ; + phy:long_name = Mole Concentration of Phytoplankton expressed as carbon in sea water ; + phy:standard_name = mole_concentration_of_phytoplankton_expressed_as_carbon_in_sea_water ; + phy:units = mmol.m-3 ; + phy:unit_long = mole_concentration_of_phytoplankton_expressed_as_carbon_in_sea_water ; + datetime64[ns] time(time) ; + time:standard_name = time ; + time:long_name = time ; + time:_CoordinateAxisType = Time ; + time:axis = T ; + float32 chl(time, depth, latitude, longitude) ; + chl:_CoordinateAxes = time depth latitude longitude ; + chl:long_name = Mass Concentration of Chlorophyll in Sea Water ; + chl:standard_name = mass_concentration_of_chlorophyll_in_sea_water ; + chl:units = mg.m-3 ; + chl:unit_long = milligram of chlorophyll per cubic meter ; + float32 nh4(time, depth, latitude, longitude) ; + nh4:_CoordinateAxes = time depth latitude longitude ; + nh4:long_name = Mole Concentration of Ammonium in Sea Water ; + nh4:standard_name = mole_concentration_of_ammonium_in_sea_water ; + nh4:units = mmol.m-3 ; + nh4:unit_long = millimoles of Ammonium per cubic meter ; + float32 longitude(longitude) ; + longitude:long_name = Longitude ; + longitude:units = degrees_east ; + longitude:standard_name = longitude ; + longitude:axis = X ; + longitude:unit_long = Degrees East ; + longitude:step = 0.08333f ; + longitude:_CoordinateAxisType = Lon ; + float32 latitude(latitude) ; + latitude:long_name = Latitude ; + latitude:units = degrees_north ; + latitude:standard_name = latitude ; + latitude:axis = Y ; + latitude:unit_long = Degrees North ; + latitude:step = 0.08333f ; + latitude:_CoordinateAxisType = Lat ; + float32 depth(depth) ; + depth:long_name = Depth ; + depth:units = m ; + depth:axis = Z ; + depth:positive = down ; + depth:unit_long = Meters ; + depth:standard_name = depth ; + depth:_CoordinateAxisType = Height ; + depth:_CoordinateZisPositive = down ; + +// global attributes: + :title = CMEMS IBI REANALYSIS: MONTHLY BIOGEOCHEMICAL PRODUCTS (REGULAR GRID) ; + :institution = Puertos del Estado (PdE) - Mercator-Ocean (MO) ; + :references = http://marine.copernicus.eu ; + :source = CMEMS IBI-MFC ; + :Conventions = CF-1.0 ; + :history = Data extracted from dataset http://puertos2.cesga.es:8080/thredds/dodsC/dataset-ibi-reanalysis-bio-005-003-monthly-regulargrid ; + :time_min = 7272.0 ; + :time_max = 112464.0 ; + :julian_day_unit = Hours since 2002-02-15 ; + :z_min = 0.5057600140571594 ; + :z_max = 0.5057600140571594 ; + :latitude_min = 43.0 ; + :latitude_max = 51.0 ; + :longitude_min = -6.000000476837158 ; + :longitude_max = 2.4999990463256836 ; +} \ No newline at end of file diff -r 000000000000 -r 810820a0d45c test-data/latitude.tabular --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/latitude.tabular Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,97 @@ +0 43.0 +1 43.083332 +2 43.166664 +3 43.25 +4 43.333332 +5 43.416664 +6 43.5 +7 43.583332 +8 43.666664 +9 43.75 +10 43.833332 +11 43.916664 +12 44.0 +13 44.083332 +14 44.166664 +15 44.25 +16 44.333332 +17 44.416664 +18 44.5 +19 44.583332 +20 44.666664 +21 44.75 +22 44.833332 +23 44.916664 +24 45.0 +25 45.083332 +26 45.166664 +27 45.25 +28 45.333332 +29 45.416664 +30 45.5 +31 45.583332 +32 45.666664 +33 45.75 +34 45.833332 +35 45.916664 +36 46.0 +37 46.083332 +38 46.166664 +39 46.25 +40 46.333332 +41 46.416664 +42 46.5 +43 46.583332 +44 46.666664 +45 46.75 +46 46.833332 +47 46.916664 +48 47.0 +49 47.083332 +50 47.166664 +51 47.25 +52 47.333332 +53 47.416664 +54 47.5 +55 47.583332 +56 47.666664 +57 47.75 +58 47.833332 +59 47.916664 +60 48.0 +61 48.083332 +62 48.166664 +63 48.25 +64 48.333332 +65 48.416664 +66 48.5 +67 48.583332 +68 48.666664 +69 48.75 +70 48.833332 +71 48.916664 +72 49.0 +73 49.083332 +74 49.166664 +75 49.25 +76 49.333332 +77 49.416664 +78 49.5 +79 49.583332 +80 49.666664 +81 49.75 +82 49.833332 +83 49.916664 +84 50.0 +85 50.083332 +86 50.166664 +87 50.25 +88 50.333332 +89 50.416664 +90 50.5 +91 50.583332 +92 50.666664 +93 50.75 +94 50.833332 +95 50.916664 +96 51.0 diff -r 000000000000 -r 810820a0d45c test-data/longitude.tabular --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/longitude.tabular Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,103 @@ +0 -6.0000005 +1 -5.916667 +2 -5.833334 +3 -5.7500005 +4 -5.666667 +5 -5.583334 +6 -5.5000005 +7 -5.416667 +8 -5.333334 +9 -5.2500005 +10 -5.166667 +11 -5.083334 +12 -5.0000005 +13 -4.9166675 +14 -4.833334 +15 -4.7500005 +16 -4.6666675 +17 -4.583334 +18 -4.5000005 +19 -4.4166675 +20 -4.333334 +21 -4.2500005 +22 -4.1666675 +23 -4.083334 +24 -4.0000005 +25 -3.9166672 +26 -3.833334 +27 -3.7500007 +28 -3.6666672 +29 -3.583334 +30 -3.5000007 +31 -3.4166672 +32 -3.333334 +33 -3.2500007 +34 -3.1666672 +35 -3.083334 +36 -3.0000007 +37 -2.9166672 +38 -2.833334 +39 -2.7500007 +40 -2.6666672 +41 -2.583334 +42 -2.5000007 +43 -2.4166672 +44 -2.333334 +45 -2.2500007 +46 -2.1666672 +47 -2.083334 +48 -2.0000007 +49 -1.9166673 +50 -1.833334 +51 -1.7500007 +52 -1.6666673 +53 -1.5833341 +54 -1.5000007 +55 -1.4166673 +56 -1.3333341 +57 -1.2500007 +58 -1.1666673 +59 -1.0833341 +60 -1.0000007 +61 -0.9166674 +62 -0.8333341 +63 -0.7500007 +64 -0.6666674 +65 -0.5833341 +66 -0.5000007 +67 -0.4166674 +68 -0.3333341 +69 -0.25000075 +70 -0.16666742 +71 -0.08333409 +72 -7.6e-07 +73 0.08333257 +74 0.1666659 +75 0.24999923 +76 0.33333257 +77 0.41666588 +78 0.49999923 +79 0.58333254 +80 0.66666585 +81 0.7499992 +82 0.83333254 +83 0.91666585 +84 0.9999992 +85 1.0833325 +86 1.1666659 +87 1.2499992 +88 1.3333325 +89 1.4166658 +90 1.4999992 +91 1.5833325 +92 1.6666658 +93 1.7499992 +94 1.8333325 +95 1.9166658 +96 1.9999992 +97 2.0833325 +98 2.1666658 +99 2.249999 +100 2.3333325 +101 2.4166658 +102 2.499999 diff -r 000000000000 -r 810820a0d45c test-data/select_by_values.netcdf Binary file test-data/select_by_values.netcdf has changed diff -r 000000000000 -r 810820a0d45c test-data/small.netcdf Binary file test-data/small.netcdf has changed diff -r 000000000000 -r 810820a0d45c test-data/small_all_variables.netcdf Binary file test-data/small_all_variables.netcdf has changed diff -r 000000000000 -r 810820a0d45c test-data/time.tabular --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/time.tabular Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,145 @@ +0 2002-12-15 +1 2003-01-15 +2 2003-02-15 +3 2003-03-15 +4 2003-04-15 +5 2003-05-15 +6 2003-06-15 +7 2003-07-15 +8 2003-08-15 +9 2003-09-15 +10 2003-10-15 +11 2003-11-15 +12 2003-12-15 +13 2004-01-15 +14 2004-02-15 +15 2004-03-15 +16 2004-04-15 +17 2004-05-15 +18 2004-06-15 +19 2004-07-15 +20 2004-08-15 +21 2004-09-15 +22 2004-10-15 +23 2004-11-15 +24 2004-12-15 +25 2005-01-15 +26 2005-02-15 +27 2005-03-15 +28 2005-04-15 +29 2005-05-15 +30 2005-06-15 +31 2005-07-15 +32 2005-08-15 +33 2005-09-15 +34 2005-10-15 +35 2005-11-15 +36 2005-12-15 +37 2006-01-15 +38 2006-02-15 +39 2006-03-15 +40 2006-04-15 +41 2006-05-15 +42 2006-06-15 +43 2006-07-15 +44 2006-08-15 +45 2006-09-15 +46 2006-10-15 +47 2006-11-15 +48 2006-12-15 +49 2007-01-15 +50 2007-02-15 +51 2007-03-15 +52 2007-04-15 +53 2007-05-15 +54 2007-06-15 +55 2007-07-15 +56 2007-08-15 +57 2007-09-15 +58 2007-10-15 +59 2007-11-15 +60 2007-12-15 +61 2008-01-15 +62 2008-02-15 +63 2008-03-15 +64 2008-04-15 +65 2008-05-15 +66 2008-06-15 +67 2008-07-15 +68 2008-08-15 +69 2008-09-15 +70 2008-10-15 +71 2008-11-15 +72 2008-12-15 +73 2009-01-15 +74 2009-02-15 +75 2009-03-15 +76 2009-04-15 +77 2009-05-15 +78 2009-06-15 +79 2009-07-15 +80 2009-08-15 +81 2009-09-15 +82 2009-10-15 +83 2009-11-15 +84 2009-12-15 +85 2010-01-15 +86 2010-02-15 +87 2010-03-15 +88 2010-04-15 +89 2010-05-15 +90 2010-06-15 +91 2010-07-15 +92 2010-08-15 +93 2010-09-15 +94 2010-10-15 +95 2010-11-15 +96 2010-12-15 +97 2011-01-15 +98 2011-02-15 +99 2011-03-15 +100 2011-04-15 +101 2011-05-15 +102 2011-06-15 +103 2011-07-15 +104 2011-08-15 +105 2011-09-15 +106 2011-10-15 +107 2011-11-15 +108 2011-12-15 +109 2012-01-15 +110 2012-02-15 +111 2012-03-15 +112 2012-04-15 +113 2012-05-15 +114 2012-06-15 +115 2012-07-15 +116 2012-08-15 +117 2012-09-15 +118 2012-10-15 +119 2012-11-15 +120 2012-12-15 +121 2013-01-15 +122 2013-02-15 +123 2013-03-15 +124 2013-04-15 +125 2013-05-15 +126 2013-06-15 +127 2013-07-15 +128 2013-08-15 +129 2013-09-15 +130 2013-10-15 +131 2013-11-15 +132 2013-12-15 +133 2014-01-15 +134 2014-02-15 +135 2014-03-15 +136 2014-04-15 +137 2014-05-15 +138 2014-06-15 +139 2014-07-15 +140 2014-08-15 +141 2014-09-15 +142 2014-10-15 +143 2014-11-15 +144 2014-12-15 diff -r 000000000000 -r 810820a0d45c test-data/time_series.png Binary file test-data/time_series.png has changed diff -r 000000000000 -r 810820a0d45c test-data/time_series.tabular --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/time_series.tabular Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,38 @@ +time longitude latitude depth chl +2010-12-15 00:00:00 -6.0000005 44.75 0.50576 0.31 +2011-01-15 00:00:00 -6.0000005 44.75 0.50576 0.37 +2011-02-15 00:00:00 -6.0000005 44.75 0.50576 0.81 +2011-03-15 00:00:00 -6.0000005 44.75 0.50576 1.41 +2011-04-15 00:00:00 -6.0000005 44.75 0.50576 1.8399999 +2011-05-15 00:00:00 -6.0000005 44.75 0.50576 0.099999994 +2011-06-15 00:00:00 -6.0000005 44.75 0.50576 0.03 +2011-07-15 00:00:00 -6.0000005 44.75 0.50576 0.03 +2011-08-15 00:00:00 -6.0000005 44.75 0.50576 0.01 +2011-09-15 00:00:00 -6.0000005 44.75 0.50576 0.01 +2011-10-15 00:00:00 -6.0000005 44.75 0.50576 0.02 +2011-11-15 00:00:00 -6.0000005 44.75 0.50576 0.07 +2011-12-15 00:00:00 -6.0000005 44.75 0.50576 0.34 +2012-01-15 00:00:00 -6.0000005 44.75 0.50576 0.35 +2012-02-15 00:00:00 -6.0000005 44.75 0.50576 0.37 +2012-03-15 00:00:00 -6.0000005 44.75 0.50576 1.5799999 +2012-04-15 00:00:00 -6.0000005 44.75 0.50576 1.12 +2012-05-15 00:00:00 -6.0000005 44.75 0.50576 1.16 +2012-06-15 00:00:00 -6.0000005 44.75 0.50576 0.07 +2012-07-15 00:00:00 -6.0000005 44.75 0.50576 0.01 +2012-08-15 00:00:00 -6.0000005 44.75 0.50576 0.02 +2012-09-15 00:00:00 -6.0000005 44.75 0.50576 0.03 +2012-10-15 00:00:00 -6.0000005 44.75 0.50576 0.22 +2012-11-15 00:00:00 -6.0000005 44.75 0.50576 0.34 +2012-12-15 00:00:00 -6.0000005 44.75 0.50576 0.29 +2013-01-15 00:00:00 -6.0000005 44.75 0.50576 0.37 +2013-02-15 00:00:00 -6.0000005 44.75 0.50576 0.38 +2013-03-15 00:00:00 -6.0000005 44.75 0.50576 1.15 +2013-04-15 00:00:00 -6.0000005 44.75 0.50576 1.9 +2013-05-15 00:00:00 -6.0000005 44.75 0.50576 0.5 +2013-06-15 00:00:00 -6.0000005 44.75 0.50576 0.12 +2013-07-15 00:00:00 -6.0000005 44.75 0.50576 0.01 +2013-08-15 00:00:00 -6.0000005 44.75 0.50576 0.0 +2013-09-15 00:00:00 -6.0000005 44.75 0.50576 0.01 +2013-10-15 00:00:00 -6.0000005 44.75 0.50576 0.01 +2013-11-15 00:00:00 -6.0000005 44.75 0.50576 0.12 +2013-12-15 00:00:00 -6.0000005 44.75 0.50576 0.34 diff -r 000000000000 -r 810820a0d45c test-data/time_series_customized.png Binary file test-data/time_series_customized.png has changed diff -r 000000000000 -r 810820a0d45c test-data/time_series_customized.tabular --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/time_series_customized.tabular Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,146 @@ +time longitude latitude depth chl +2002-12-15 00:00:00 -5.0000005 43.5 0.50576 0.34 +2003-01-15 00:00:00 -5.0000005 43.5 0.50576 0.41 +2003-02-15 00:00:00 -5.0000005 43.5 0.50576 0.55 +2003-03-15 00:00:00 -5.0000005 43.5 0.50576 1.0699999 +2003-04-15 00:00:00 -5.0000005 43.5 0.50576 0.89 +2003-05-15 00:00:00 -5.0000005 43.5 0.50576 0.14 +2003-06-15 00:00:00 -5.0000005 43.5 0.50576 0.02 +2003-07-15 00:00:00 -5.0000005 43.5 0.50576 0.02 +2003-08-15 00:00:00 -5.0000005 43.5 0.50576 0.02 +2003-09-15 00:00:00 -5.0000005 43.5 0.50576 0.04 +2003-10-15 00:00:00 -5.0000005 43.5 0.50576 0.08 +2003-11-15 00:00:00 -5.0000005 43.5 0.50576 0.39 +2003-12-15 00:00:00 -5.0000005 43.5 0.50576 0.31 +2004-01-15 00:00:00 -5.0000005 43.5 0.50576 0.38 +2004-02-15 00:00:00 -5.0000005 43.5 0.50576 0.57 +2004-03-15 00:00:00 -5.0000005 43.5 0.50576 1.05 +2004-04-15 00:00:00 -5.0000005 43.5 0.50576 1.43 +2004-05-15 00:00:00 -5.0000005 43.5 0.50576 1.27 +2004-06-15 00:00:00 -5.0000005 43.5 0.50576 0.81 +2004-07-15 00:00:00 -5.0000005 43.5 0.50576 0.07 +2004-08-15 00:00:00 -5.0000005 43.5 0.50576 0.07 +2004-09-15 00:00:00 -5.0000005 43.5 0.50576 0.07 +2004-10-15 00:00:00 -5.0000005 43.5 0.50576 0.19999999 +2004-11-15 00:00:00 -5.0000005 43.5 0.50576 0.41 +2004-12-15 00:00:00 -5.0000005 43.5 0.50576 0.37 +2005-01-15 00:00:00 -5.0000005 43.5 0.50576 0.42 +2005-02-15 00:00:00 -5.0000005 43.5 0.50576 0.59 +2005-03-15 00:00:00 -5.0000005 43.5 0.50576 1.37 +2005-04-15 00:00:00 -5.0000005 43.5 0.50576 1.4399999 +2005-05-15 00:00:00 -5.0000005 43.5 0.50576 0.34 +2005-06-15 00:00:00 -5.0000005 43.5 0.50576 0.22999999 +2005-07-15 00:00:00 -5.0000005 43.5 0.50576 0.07 +2005-08-15 00:00:00 -5.0000005 43.5 0.50576 0.75 +2005-09-15 00:00:00 -5.0000005 43.5 0.50576 0.07 +2005-10-15 00:00:00 -5.0000005 43.5 0.50576 0.22999999 +2005-11-15 00:00:00 -5.0000005 43.5 0.50576 0.5 +2005-12-15 00:00:00 -5.0000005 43.5 0.50576 0.42 +2006-01-15 00:00:00 -5.0000005 43.5 0.50576 0.51 +2006-02-15 00:00:00 -5.0000005 43.5 0.50576 0.81 +2006-03-15 00:00:00 -5.0000005 43.5 0.50576 1.78 +2006-04-15 00:00:00 -5.0000005 43.5 0.50576 1.87 +2006-05-15 00:00:00 -5.0000005 43.5 0.50576 0.37 +2006-06-15 00:00:00 -5.0000005 43.5 0.50576 0.87 +2006-07-15 00:00:00 -5.0000005 43.5 0.50576 0.04 +2006-08-15 00:00:00 -5.0000005 43.5 0.50576 0.04 +2006-09-15 00:00:00 -5.0000005 43.5 0.50576 0.03 +2006-10-15 00:00:00 -5.0000005 43.5 0.50576 0.22 +2006-11-15 00:00:00 -5.0000005 43.5 0.50576 0.51 +2006-12-15 00:00:00 -5.0000005 43.5 0.50576 0.41 +2007-01-15 00:00:00 -5.0000005 43.5 0.50576 0.39999998 +2007-02-15 00:00:00 -5.0000005 43.5 0.50576 0.61 +2007-03-15 00:00:00 -5.0000005 43.5 0.50576 1.24 +2007-04-15 00:00:00 -5.0000005 43.5 0.50576 1.09 +2007-05-15 00:00:00 -5.0000005 43.5 0.50576 0.28 +2007-06-15 00:00:00 -5.0000005 43.5 0.50576 0.07 +2007-07-15 00:00:00 -5.0000005 43.5 0.50576 0.01 +2007-08-15 00:00:00 -5.0000005 43.5 0.50576 0.02 +2007-09-15 00:00:00 -5.0000005 43.5 0.50576 1.6899999 +2007-10-15 00:00:00 -5.0000005 43.5 0.50576 0.71999997 +2007-11-15 00:00:00 -5.0000005 43.5 0.50576 1.25 +2007-12-15 00:00:00 -5.0000005 43.5 0.50576 0.68 +2008-01-15 00:00:00 -5.0000005 43.5 0.50576 0.57 +2008-02-15 00:00:00 -5.0000005 43.5 0.50576 0.95 +2008-03-15 00:00:00 -5.0000005 43.5 0.50576 1.1 +2008-04-15 00:00:00 -5.0000005 43.5 0.50576 1.35 +2008-05-15 00:00:00 -5.0000005 43.5 0.50576 0.34 +2008-06-15 00:00:00 -5.0000005 43.5 0.50576 0.01 +2008-07-15 00:00:00 -5.0000005 43.5 0.50576 0.04 +2008-08-15 00:00:00 -5.0000005 43.5 0.50576 0.02 +2008-09-15 00:00:00 -5.0000005 43.5 0.50576 0.31 +2008-10-15 00:00:00 -5.0000005 43.5 0.50576 0.17 +2008-11-15 00:00:00 -5.0000005 43.5 0.50576 0.21 +2008-12-15 00:00:00 -5.0000005 43.5 0.50576 0.34 +2009-01-15 00:00:00 -5.0000005 43.5 0.50576 0.42999998 +2009-02-15 00:00:00 -5.0000005 43.5 0.50576 0.55 +2009-03-15 00:00:00 -5.0000005 43.5 0.50576 1.0 +2009-04-15 00:00:00 -5.0000005 43.5 0.50576 0.71999997 +2009-05-15 00:00:00 -5.0000005 43.5 0.50576 0.14 +2009-06-15 00:00:00 -5.0000005 43.5 0.50576 0.07 +2009-07-15 00:00:00 -5.0000005 43.5 0.50576 0.02 +2009-08-15 00:00:00 -5.0000005 43.5 0.50576 0.01 +2009-09-15 00:00:00 -5.0000005 43.5 0.50576 0.29 +2009-10-15 00:00:00 -5.0000005 43.5 0.50576 0.90999997 +2009-11-15 00:00:00 -5.0000005 43.5 0.50576 0.45 +2009-12-15 00:00:00 -5.0000005 43.5 0.50576 0.34 +2010-01-15 00:00:00 -5.0000005 43.5 0.50576 0.42999998 +2010-02-15 00:00:00 -5.0000005 43.5 0.50576 0.56 +2010-03-15 00:00:00 -5.0000005 43.5 0.50576 1.35 +2010-04-15 00:00:00 -5.0000005 43.5 0.50576 1.63 +2010-05-15 00:00:00 -5.0000005 43.5 0.50576 0.41 +2010-06-15 00:00:00 -5.0000005 43.5 0.50576 0.099999994 +2010-07-15 00:00:00 -5.0000005 43.5 0.50576 0.07 +2010-08-15 00:00:00 -5.0000005 43.5 0.50576 0.03 +2010-09-15 00:00:00 -5.0000005 43.5 0.50576 0.14 +2010-10-15 00:00:00 -5.0000005 43.5 0.50576 0.099999994 +2010-11-15 00:00:00 -5.0000005 43.5 0.50576 0.34 +2010-12-15 00:00:00 -5.0000005 43.5 0.50576 0.37 +2011-01-15 00:00:00 -5.0000005 43.5 0.50576 0.55 +2011-02-15 00:00:00 -5.0000005 43.5 0.50576 0.96999997 +2011-03-15 00:00:00 -5.0000005 43.5 0.50576 1.65 +2011-04-15 00:00:00 -5.0000005 43.5 0.50576 1.16 +2011-05-15 00:00:00 -5.0000005 43.5 0.50576 0.32 +2011-06-15 00:00:00 -5.0000005 43.5 0.50576 0.07 +2011-07-15 00:00:00 -5.0000005 43.5 0.50576 0.089999996 +2011-08-15 00:00:00 -5.0000005 43.5 0.50576 0.03 +2011-09-15 00:00:00 -5.0000005 43.5 0.50576 0.02 +2011-10-15 00:00:00 -5.0000005 43.5 0.50576 0.25 +2011-11-15 00:00:00 -5.0000005 43.5 0.50576 0.34 +2011-12-15 00:00:00 -5.0000005 43.5 0.50576 0.37 +2012-01-15 00:00:00 -5.0000005 43.5 0.50576 0.45 +2012-02-15 00:00:00 -5.0000005 43.5 0.50576 0.68 +2012-03-15 00:00:00 -5.0000005 43.5 0.50576 1.81 +2012-04-15 00:00:00 -5.0000005 43.5 0.50576 1.75 +2012-05-15 00:00:00 -5.0000005 43.5 0.50576 1.03 +2012-06-15 00:00:00 -5.0000005 43.5 0.50576 0.07 +2012-07-15 00:00:00 -5.0000005 43.5 0.50576 0.01 +2012-08-15 00:00:00 -5.0000005 43.5 0.50576 0.01 +2012-09-15 00:00:00 -5.0000005 43.5 0.50576 0.099999994 +2012-10-15 00:00:00 -5.0000005 43.5 0.50576 0.07 +2012-11-15 00:00:00 -5.0000005 43.5 0.50576 0.14 +2012-12-15 00:00:00 -5.0000005 43.5 0.50576 0.34 +2013-01-15 00:00:00 -5.0000005 43.5 0.50576 0.5 +2013-02-15 00:00:00 -5.0000005 43.5 0.50576 1.09 +2013-03-15 00:00:00 -5.0000005 43.5 0.50576 1.62 +2013-04-15 00:00:00 -5.0000005 43.5 0.50576 1.4 +2013-05-15 00:00:00 -5.0000005 43.5 0.50576 0.37 +2013-06-15 00:00:00 -5.0000005 43.5 0.50576 0.07 +2013-07-15 00:00:00 -5.0000005 43.5 0.50576 0.48 +2013-08-15 00:00:00 -5.0000005 43.5 0.50576 0.08 +2013-09-15 00:00:00 -5.0000005 43.5 0.50576 0.21 +2013-10-15 00:00:00 -5.0000005 43.5 0.50576 0.07 +2013-11-15 00:00:00 -5.0000005 43.5 0.50576 0.37 +2013-12-15 00:00:00 -5.0000005 43.5 0.50576 0.59 +2014-01-15 00:00:00 -5.0000005 43.5 0.50576 0.56 +2014-02-15 00:00:00 -5.0000005 43.5 0.50576 0.90999997 +2014-03-15 00:00:00 -5.0000005 43.5 0.50576 1.3299999 +2014-04-15 00:00:00 -5.0000005 43.5 0.50576 1.09 +2014-05-15 00:00:00 -5.0000005 43.5 0.50576 0.37 +2014-06-15 00:00:00 -5.0000005 43.5 0.50576 0.11 +2014-07-15 00:00:00 -5.0000005 43.5 0.50576 0.02 +2014-08-15 00:00:00 -5.0000005 43.5 0.50576 0.02 +2014-09-15 00:00:00 -5.0000005 43.5 0.50576 0.11 +2014-10-15 00:00:00 -5.0000005 43.5 0.50576 0.02 +2014-11-15 00:00:00 -5.0000005 43.5 0.50576 0.07 +2014-12-15 00:00:00 -5.0000005 43.5 0.50576 0.17 diff -r 000000000000 -r 810820a0d45c test-data/var_tab_dataset-ibi --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/var_tab_dataset-ibi Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,7 @@ +time 1 time 145 +chl 4 time 145 depth 1 latitude 97 longitude 103 +nh4 4 time 145 depth 1 latitude 97 longitude 103 +longitude 1 longitude 103 +latitude 1 latitude 97 +depth 1 depth 1 +phy 4 time 145 depth 1 latitude 97 longitude 103 diff -r 000000000000 -r 810820a0d45c test-data/version.tabular --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/version.tabular Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,1 @@ +Galaxy xarray version 2022.3.0 diff -r 000000000000 -r 810820a0d45c test-data/where_condition.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/where_condition.txt Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,1 @@ +((chl > 1) | (chl < 45)) & (nh4 > 1) diff -r 000000000000 -r 810820a0d45c test-data/where_condition_simple.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/where_condition_simple.txt Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,1 @@ +nh4 > 5.15 diff -r 000000000000 -r 810820a0d45c timeseries.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/timeseries.py Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,182 @@ +#!/usr/bin/env python3 +# +# +# usage: netCDF_timeseries.py [-h] [--output output.png] +# [--save timeseries.tabular] +# [--config config-file] +# [-v] +# input varname +# positional arguments: +# input input filename with geographical coordinates (netCDF +# format) +# varname Specify which variable to extract (case sensitive) +# +# optional arguments: +# -h, --help show this help message and exit +# --output output.png filename to store image (png format) +# --save timeseries.tabular filename to store timeseries (tabular format) +# --config config file extract parameters +# -v, --verbose switch on verbose mode +# +import argparse +import ast +import warnings + +import cftime # noqa: F401 + +import matplotlib as mpl +mpl.use('Agg') + +import matplotlib.pyplot as plt # noqa: I202,E402 +from matplotlib.dates import DateFormatter # noqa: I202,E402 + +import xarray as xr # noqa: I202,E402 + + +class TimeSeries (): + def __init__(self, input, varname, output, save, verbose=False, + config_file=""): + + li = list(input.split(",")) + if len(li) > 1: + self.input = li + else: + self.input = input + + self.varname = varname + self.xylim_supported = True + if output == "" or output is None: + self.output = "Timeseries.png" + else: + self.output = output + if save == "" or save is None: + self.save = "Timeseries.tabular" + else: + self.save = save + self.verbose = verbose + self.time_start_value = "" + self.time_end_value = "" + self.lon_value = "" + self.lat_value = "" + self.lat_name = 'lat' + self.lon_name = 'lon' + self.time_name = 'time' + self.title = '' + self.xlabel = '' + self.ylabel = '' + self.format_date = '' + if config_file != "" and config_file is not None: + with open(config_file) as f: + sdict = ''.join( + f.read().replace("\n", "").split('{')[1].split('}')[0] + ) + tmp = ast.literal_eval('{' + sdict.strip() + '}') + for key in tmp: + if key == 'time_start_value': + self.time_start_value = tmp[key] + if key == 'time_end_value': + self.time_end_value = tmp[key] + if key == 'lon_value': + self.lon_value = tmp[key] + if key == 'lat_value': + self.lat_value = tmp[key] + if key == 'lon_name': + self.lon_name = tmp[key] + if key == 'lat_name': + self.lat_name = tmp[key] + if key == 'time_name': + self.time_name = tmp[key] + if key == 'title': + self.title = tmp[key] + if key == 'xlabel': + self.xlabel = tmp[key] + if key == 'ylabel': + self.ylabel = tmp[key] + if key == 'format_date': + self.format_date = tmp[key] + self.format_date = self.format_date.replace('X', '%') + + if type(self.input) is list: + self.dset = xr.open_mfdataset(self.input, use_cftime=True) + else: + self.dset = xr.open_dataset(self.input, use_cftime=True) + + if verbose: + print("input: ", self.input) + print("varname: ", self.varname) + if self.time_start_value: + print("time_start_value: ", self.time_start_value) + if self.time_end_value: + print("time_end_value: ", self.time_end_value) + print("output: ", self.output) + if self.lon_value: + print(self.lon_name, self.lon_value) + if self.lat_value: + print(self.lat_name, self.lat_value) + + def plot(self): + if self.lon_value: + lon_c = float(self.lon_value) + if self.lat_value: + lat_c = float(self.lat_value) + if self.lat_value and self.lon_value: + self.df = self.dset.sel({self.lat_name: lat_c, + self.lon_name: lon_c}, + method='nearest') + else: + self.df = self.dset + if self.time_start_value or self.time_end_value: + self.df = self.df.sel({self.time_name: slice(self.time_start_value, + self.time_end_value)}) + # Saving the time series into a tabular + self.df = self.df[self.varname].squeeze().to_dataframe() + self.df.dropna().to_csv(self.save, sep='\t') + # Plot the time series into png image + fig = plt.figure(figsize=(15, 5)) + ax = plt.subplot(111) + self.df[self.varname].plot(ax=ax) + if self.title: + plt.title(self.title) + if self.xlabel: + plt.xlabel(self.xlabel) + if self.ylabel: + plt.ylabel(self.ylabel) + if self.format_date: + ax.xaxis.set_major_formatter(DateFormatter(self.format_date)) + fig.tight_layout() + fig.savefig(self.output) + + +if __name__ == '__main__': + warnings.filterwarnings("ignore") + parser = argparse.ArgumentParser() + parser.add_argument( + 'input', + help='input filename with geographical coordinates (netCDF format)' + ) + parser.add_argument( + 'varname', + help='Specify which variable to plot (case sensitive)' + ) + parser.add_argument( + '--output', + help='output filename to store resulting image (png format)' + ) + parser.add_argument( + '--save', + help='save resulting tabular file (tabular format) into filename' + ) + parser.add_argument( + '--config', + help='pass timeseries parameters via a config file' + ) + parser.add_argument( + "-v", "--verbose", + help="switch on verbose mode", + action="store_true") + args = parser.parse_args() + + dset = TimeSeries(input=args.input, varname=args.varname, + output=args.output, save=args.save, verbose=args.verbose, + config_file=args.config) + dset.plot() diff -r 000000000000 -r 810820a0d45c timeseries_plot.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/timeseries_plot.xml Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,120 @@ + + Extract and plot time series + + macros.xml + macros_timeseries.xml + + + + xarray + python + netcdf4 + matplotlib + dask + pandas + cftime + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + + + + + + + + + + + + + + + +
+ + +
diff -r 000000000000 -r 810820a0d45c xarray_info.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xarray_info.py Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,107 @@ +# xarray tool for: +# - getting metadata information +# - select data and save results in csv file for further post-processing + +import argparse +import csv +import os +import warnings + +import xarray as xr + + +class XarrayInfo (): + def __init__(self, infile, outfile_info="", outfile_summary="", + verbose=False, coords_info=None): + self.infile = infile + self.outfile_info = outfile_info + self.outfile_summary = outfile_summary + self.coords_info = coords_info + self.verbose = verbose + # initialization + self.dset = None + self.gset = None + if self.verbose: + print("infile: ", self.infile) + print("outfile_info: ", self.outfile_info) + print("outfile_summary: ", self.outfile_summary) + print("coords_info: ", self.coords_info) + + def info(self): + f = open(self.outfile_info, 'w') + ds = xr.open_dataset(self.infile) + ds.info(f) + f.close() + + def summary(self): + f = open(self.outfile_summary, 'w') + ds = xr.open_dataset(self.infile) + writer = csv.writer(f, delimiter='\t') + header = ['VariableName', 'NumberOfDimensions'] + for idx, val in enumerate(ds.dims.items()): + header.append('Dim' + str(idx) + 'Name') + header.append('Dim' + str(idx) + 'Size') + writer.writerow(header) + for name, da in ds.data_vars.items(): + line = [name] + line.append(len(ds[name].shape)) + for d, s in zip(da.shape, da.sizes): + line.append(s) + line.append(d) + writer.writerow(line) + for name, da in ds.coords.items(): + line = [name] + line.append(len(ds[name].shape)) + for d, s in zip(da.shape, da.sizes): + line.append(s) + line.append(d) + writer.writerow(line) + f.close() + + def get_coords_info(self): + ds = xr.open_dataset(self.infile) + for c in ds.coords: + filename = os.path.join(self.coords_info, + c.strip() + + '.tabular') + pd = ds.coords[c].to_pandas() + pd.index = range(len(pd)) + pd.to_csv(filename, header=False, sep='\t') + + +if __name__ == '__main__': + warnings.filterwarnings("ignore") + parser = argparse.ArgumentParser() + + parser.add_argument( + 'infile', + help='netCDF input filename' + ) + parser.add_argument( + '--info', + help='Output filename where metadata information is stored' + ) + parser.add_argument( + '--summary', + help='Output filename where data summary information is stored' + ) + parser.add_argument( + '--coords_info', + help='output-folder where for each coordinate, coordinate values ' + ' are being printed in the corresponding outputfile' + ) + parser.add_argument( + "-v", "--verbose", + help="switch on verbose mode", + action="store_true" + ) + args = parser.parse_args() + + p = XarrayInfo(args.infile, args.info, args.summary, + args.verbose, args.coords_info) + if args.info: + p.info() + elif args.coords_info: + p.get_coords_info() + if args.summary: + p.summary() diff -r 000000000000 -r 810820a0d45c xarray_mapplot.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xarray_mapplot.py Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,411 @@ +#!/usr/bin/env python3 +# +# +# usage: xarray_mapplot.py [-h] [--proj PROJ] +# [--cmap CMAP] +# [--output OUTPUT] +# [--time TIMES] +# [--nrow NROW] +# [--ncol NCOL] +# [--title title] +# [--latitude LATITUDE] +# [--longitude LONGITUDE] +# [--land ALPHA-LAND] +# [--ocean ALPHA-OCEAN] +# [--coastline ALPHA-COASTLINE] +# [--borders ALPHA-BORDERS] +# [--xlim "x1,x2"] +# [--ylim "y1,y2"] +# [--range "valmin,valmax"] +# [--threshold VAL] +# [--label label-colorbar] +# [--config config-file] +# [--shift] +# [-v] +# input varname +# +# positional arguments: +# input input filename with geographical coordinates (netCDF +# format) +# varname Specify which variable to plot (case sensitive) +# +# optional arguments: +# -h, --help show this help message and exit +# --proj PROJ Specify the projection on which we draw +# --cmap CMAP Specify which colormap to use for plotting +# --output OUTPUT output filename to store resulting image (png format) +# --time TIMES time index from the file for multiple plots ("0 1 2 3") +# --title plot or subplot title +# --latitude variable name for latitude +# --longitude variable name for longitude +# --land add land on plot with alpha value [0-1] +# --ocean add oceans on plot with alpha value [0-1] +# --coastline add coastline with alpha value [0-1] +# --borders add country borders with alpha value [0-1] +# --xlim limited geographical area longitudes "x1,x2" +# --ylim limited geographical area latitudes "y1,y2" +# --range "valmin,valmax" for plotting +# --threshold do not plot values below threshold +# --label set a label for colormap +# --config plotting parameters are passed via a config file +# (overwrite other plotting options) +# --shift shift longitudes if specified +# -v, --verbose switch on verbose mode +# + +import argparse +import ast +import warnings +from pathlib import Path + +import cartopy.crs as ccrs +import cartopy.feature as feature + +from cmcrameri import cm + +import matplotlib as mpl +mpl.use('Agg') +from matplotlib import pyplot # noqa: I202,E402 + +import xarray as xr # noqa: E402 + + +class MapPlotXr (): + def __init__(self, input, varname, output, verbose=False, + config_file="", proj="", shift=False): + + li = list(input.split(",")) + if len(li) > 1: + self.input = li + else: + self.input = input + + if proj != "" and proj is not None and Path(proj).exists(): + f = open(proj) + sdict = ''.join( + f.read().replace("\n", "").split('{')[1].split('}')[0] + ) + self.proj = '{' + sdict.strip() + '}' + else: + self.proj = None + self.varname = varname + self.shift = shift + self.xylim_supported = False + self.colorbar = True + if output is None: + if type(self.input) is list: + self.output = Path(self.input[0]).stem + '.png' + else: + self.output = Path(self.input).stem + '.png' + else: + self.output = output + self.verbose = verbose + self.label = {} + self.time = [] + self.xlim = [] + self.ylim = [] + self.range = [] + self.latitude = "latitude" + self.longitude = "longitude" + self.land = 0 + self.ocean = 0 + self.coastline = 0 + self.borders = 0 + self.cmap = "coolwarm" + self.threshold = "" + self.title = "" + + if config_file != "" and config_file is not None: + with open(config_file) as f: + sdict = ''.join( + f.read().replace("\n", "").split('{')[1].split('}')[0] + ) + tmp = ast.literal_eval('{' + sdict.strip() + '}') + for key in tmp: + if key == 'time': + time = tmp[key] + self.time = list(map(int, time.split(","))) + if key == 'cmap': + self.get_cmap(tmp[key]) + if key == 'latitude': + self.latitude = tmp[key] + if key == 'longitude': + self.longitude = tmp[key] + if key == 'land': + self.land = float(tmp[key]) + if key == 'ocean': + self.ocean = float(tmp[key]) + if key == 'coastline': + self.coastline = float(tmp[key]) + if key == 'borders': + self.borders = float(tmp[key]) + if key == 'xlim': + xlim = tmp[key] + self.xlim = list(map(float, xlim.split(","))) + if key == 'ylim': + ylim = tmp[key] + self.ylim = list(map(float, ylim.split(","))) + if key == 'range': + range_values = tmp[key] + self.range = list(map(float, range_values.split(","))) + if key == 'threshold': + self.threshold = float(tmp[key]) + if key == 'label': + self.label['label'] = tmp[key] + if key == 'title': + self.title = tmp[key] + + if type(self.input) is list: + self.dset = xr.open_mfdataset(self.input, use_cftime=True) + else: + self.dset = xr.open_dataset(self.input, use_cftime=True) + + if verbose: + print("input: ", self.input) + print("proj: ", self.proj) + print("varname: ", self.varname) + print("time: ", self.time) + print("minval, maxval: ", self.range) + print("title: ", self.title) + print("output: ", self.output) + print("label: ", self.label) + print("shift: ", self.shift) + print("ocean: ", self.ocean) + print("land: ", self.land) + print("coastline: ", self.coastline) + print("borders: ", self.borders) + print("latitude: ", self.latitude) + print("longitude: ", self.longitude) + print("xlim: ", self.xlim) + print("ylim: ", self.ylim) + + def get_cmap(self, cmap): + if cmap[0:3] == 'cm.': + self.cmap = cm.__dict__[cmap[3:]] + else: + self.cmap = cmap + + def projection(self): + if self.proj is None: + return ccrs.PlateCarree() + + proj_dict = ast.literal_eval(self.proj) + user_proj = proj_dict.pop("proj") + if user_proj == 'PlateCarree': + self.xylim_supported = True + return ccrs.PlateCarree(**proj_dict) + elif user_proj == 'AlbersEqualArea': + return ccrs.AlbersEqualArea(**proj_dict) + elif user_proj == 'AzimuthalEquidistant': + return ccrs.AzimuthalEquidistant(**proj_dict) + elif user_proj == 'EquidistantConic': + return ccrs.EquidistantConic(**proj_dict) + elif user_proj == 'LambertConformal': + return ccrs.LambertConformal(**proj_dict) + elif user_proj == 'LambertCylindrical': + return ccrs.LambertCylindrical(**proj_dict) + elif user_proj == 'Mercator': + return ccrs.Mercator(**proj_dict) + elif user_proj == 'Miller': + return ccrs.Miller(**proj_dict) + elif user_proj == 'Mollweide': + return ccrs.Mollweide(**proj_dict) + elif user_proj == 'Orthographic': + return ccrs.Orthographic(**proj_dict) + elif user_proj == 'Robinson': + return ccrs.Robinson(**proj_dict) + elif user_proj == 'Sinusoidal': + return ccrs.Sinusoidal(**proj_dict) + elif user_proj == 'Stereographic': + return ccrs.Stereographic(**proj_dict) + elif user_proj == 'TransverseMercator': + return ccrs.TransverseMercator(**proj_dict) + elif user_proj == 'UTM': + return ccrs.UTM(**proj_dict) + elif user_proj == 'InterruptedGoodeHomolosine': + return ccrs.InterruptedGoodeHomolosine(**proj_dict) + elif user_proj == 'RotatedPole': + return ccrs.RotatedPole(**proj_dict) + elif user_proj == 'OSGB': + self.xylim_supported = False + return ccrs.OSGB(**proj_dict) + elif user_proj == 'EuroPP': + self.xylim_supported = False + return ccrs.EuroPP(**proj_dict) + elif user_proj == 'Geostationary': + return ccrs.Geostationary(**proj_dict) + elif user_proj == 'NearsidePerspective': + return ccrs.NearsidePerspective(**proj_dict) + elif user_proj == 'EckertI': + return ccrs.EckertI(**proj_dict) + elif user_proj == 'EckertII': + return ccrs.EckertII(**proj_dict) + elif user_proj == 'EckertIII': + return ccrs.EckertIII(**proj_dict) + elif user_proj == 'EckertIV': + return ccrs.EckertIV(**proj_dict) + elif user_proj == 'EckertV': + return ccrs.EckertV(**proj_dict) + elif user_proj == 'EckertVI': + return ccrs.EckertVI(**proj_dict) + elif user_proj == 'EqualEarth': + return ccrs.EqualEarth(**proj_dict) + elif user_proj == 'Gnomonic': + return ccrs.Gnomonic(**proj_dict) + elif user_proj == 'LambertAzimuthalEqualArea': + return ccrs.LambertAzimuthalEqualArea(**proj_dict) + elif user_proj == 'NorthPolarStereo': + return ccrs.NorthPolarStereo(**proj_dict) + elif user_proj == 'OSNI': + return ccrs.OSNI(**proj_dict) + elif user_proj == 'SouthPolarStereo': + return ccrs.SouthPolarStereo(**proj_dict) + + def plot(self, ts=None): + if self.shift: + if self.longitude == 'longitude': + self.dset = self.dset.assign_coords( + longitude=((( + self.dset[self.longitude] + + 180) % 360) - 180)) + elif self.longitude == 'lon': + self.dset = self.dset.assign_coords( + lon=(((self.dset[self.longitude] + + 180) % 360) - 180)) + + pyplot.figure(1, figsize=[20, 10]) + + # Set the projection to use for plotting + ax = pyplot.subplot(1, 1, 1, projection=self.projection()) + if self.land: + ax.add_feature(feature.LAND, alpha=self.land) + + if self.ocean: + ax.add_feature(feature.OCEAN, alpha=self.ocean) + if self.coastline: + ax.coastlines(resolution='10m', alpha=self.coastline) + if self.borders: + ax.add_feature(feature.BORDERS, linestyle=':', alpha=self.borders) + + if self.xlim: + min_lon = min(self.xlim[0], self.xlim[1]) + max_lon = max(self.xlim[0], self.xlim[1]) + else: + min_lon = self.dset[self.longitude].min() + max_lon = self.dset[self.longitude].max() + + if self.ylim: + min_lat = min(self.ylim[0], self.ylim[1]) + max_lat = max(self.ylim[0], self.ylim[1]) + else: + min_lat = self.dset[self.latitude].min() + max_lat = self.dset[self.latitude].max() + + if self.xylim_supported: + pyplot.xlim(min_lon, max_lon) + pyplot.ylim(min_lat, max_lat) + + # Fix extent + if self.threshold == "" or self.threshold is None: + threshold = self.dset[self.varname].min() + else: + threshold = float(self.threshold) + + if self.range == []: + minval = self.dset[self.varname].min() + maxval = self.dset[self.varname].max() + else: + minval = self.range[0] + maxval = self.range[1] + + if self.verbose: + print("minval: ", minval) + print("maxval: ", maxval) + + # pass extent with vmin and vmax parameters + proj_t = ccrs.PlateCarree() + if ts is None: + self.dset.where( + self.dset[self.varname] > threshold + )[self.varname].plot(ax=ax, + vmin=minval, + vmax=maxval, + transform=proj_t, + cmap=self.cmap, + cbar_kwargs=self.label + ) + if self.title != "" and self.title is not None: + pyplot.title(self.title) + pyplot.savefig(self.output) + else: + if self.colorbar: + self.dset.where( + self.dset[self.varname] > threshold + )[self.varname].isel(time=ts).plot(ax=ax, + vmin=minval, + vmax=maxval, + transform=proj_t, + cmap=self.cmap, + cbar_kwargs=self.label + ) + else: + self.dset.where( + self.dset[self.varname] > minval + )[self.varname].isel(time=ts).plot(ax=ax, + vmin=minval, + vmax=maxval, + transform=proj_t, + cmap=self.cmap, + add_colorbar=False) + if self.title != "" and self.title is not None: + pyplot.title(self.title + "(time = " + str(ts) + ')') + pyplot.savefig(self.output[:-4] + "_time" + str(ts) + + self.output[-4:]) # assume png format + + +if __name__ == '__main__': + warnings.filterwarnings("ignore") + parser = argparse.ArgumentParser() + parser.add_argument( + 'input', + help='input filename with geographical coordinates (netCDF format)' + ) + parser.add_argument( + '--proj', + help='Config file with the projection on which we draw' + ) + parser.add_argument( + 'varname', + help='Specify which variable to plot (case sensitive)' + ) + parser.add_argument( + '--output', + help='output filename to store resulting image (png format)' + ) + parser.add_argument( + '--config', + help='pass plotting parameters via a config file' + ) + parser.add_argument( + '--shift', + help='shift longitudes if specified', + action="store_true" + ) + parser.add_argument( + "-v", "--verbose", + help="switch on verbose mode", + action="store_true") + args = parser.parse_args() + + dset = MapPlotXr(input=args.input, varname=args.varname, + output=args.output, verbose=args.verbose, + config_file=args.config, proj=args.proj, + shift=args.shift) + + if dset.time == []: + dset.plot() + else: + for t in dset.time: + dset.plot(t) + dset.shift = False # only shift once + dset.colorbar = True diff -r 000000000000 -r 810820a0d45c xarray_netcdf2netcdf.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xarray_netcdf2netcdf.py Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,268 @@ +#!/usr/bin/env python3 +# +# Apply operations on selected variables +# - scale +# one can also select the range of time (for timeseries) +# to apply these operations over the range only +# when a range of time is selected and when scaling, one +# can choose to save the entire timeseries or +# the selected range only. +# when scaling, one can add additional filters on dimensions +# (typically used to filter over latitudes and longitudes) + + +import argparse +import re +import warnings +from pathlib import Path + +import xarray as xr # noqa: E402 + + +class netCDF2netCDF (): + def __init__(self, infile, varname, scale="", + output="output.netcdf", + write_all=False, + keep_attributes=True, + filter_list="", + where_config="", + other="", + sel=False, + drop=False, + verbose=False): + self.drop = drop + if Path(where_config).exists(): + f = open(where_config) + self.where = f.read().replace("\n", "") + else: + self.where = "" + self.other = other + self.sel = sel + li = list(infile.split(",")) + if len(li) > 1: + self.infile = li + else: + self.infile = infile + self.verbose = verbose + if varname == 'None' or varname is None: + self.varname = varname + else: + li = list(varname.split(",")) + self.varname = li + self.write_all = write_all + self.keep_attributes = keep_attributes + if self.keep_attributes: + xr.set_options(keep_attrs=True) + self.filter = filter_list + self.selection = {} + self.method = {} + if scale == "" or scale is None: + self.scale = 1 + else: + self.scale = float(scale) + if output is None: + self.output = "output.netcdf" + else: + self.output = output + # initialization + self.dset = None + self.subset = None + if self.verbose: + print("infile: ", self.infile) + print("varname: ", self.varname) + print("filter_list: ", self.filter) + print("scale: ", self.scale) + print("write_all: ", self.write_all) + print("keep_attributes: ", self.keep_attributes) + print("sel: ", self.sel) + print("output: ", self.output) + + def apply_selection(self): + self.dset = self.ds + for key in self.selection: + if 'slice' in str(self.selection[key]): + self.dset = self.dset.sel( + {key: self.selection[key]} + ) + else: + self.dset = self.dset.sel( + {key: self.selection[key]}, + method=self.method[key] + ) + + def dimension_selection(self, single_filter): + split_filter = single_filter.split('#') + dimension_varname = split_filter[0] + op = split_filter[1] + if self.sel: + ll = float(split_filter[2]) + else: + ll = int(split_filter[2]) + if (op == 'sl'): + if self.sel: + rl = float(split_filter[3]) + else: + rl = int(split_filter[3]) + self.selection[dimension_varname] = slice(ll, rl) + elif (op == 'to'): + self.selection[dimension_varname] = slice(None, ll) + elif (op == 'from'): + self.selection[dimension_varname] = slice(ll, None) + elif (op == 'is'): + self.selection[dimension_varname] = ll + if self.sel: + rl = split_filter[3] + if 'None' in rl: + self.method[dimension_varname] = None + else: + self.method[dimension_varname] = rl + + def filter_selection(self): + for single_filter in self.filter: + self.dimension_selection(single_filter) + + if self.sel: + self.apply_selection() + else: + self.dset = \ + self.ds.isel(self.selection) + + if self.varname != 'None' and self.varname is not None: + for var in self.varname: + self.dset[var] = \ + self.dset[var]*self.scale + + def compute(self): + if self.dset is None: + if type(self.infile) is list: + self.ds = xr.open_mfdataset(self.infile) + else: + self.ds = xr.open_dataset(self.infile) + if self.where != "": + if self.drop: + if self.verbose: + print("Where with drop=True") + self.ds = self.ds.where( + self.eval_where(self.where), + drop=True + ) + elif self.other is not None and self.other != "": + if self.verbose: + print("Where with other=", float(self.other)) + self.ds = self.ds.where( + self.eval_where(self.where), + other=float(self.other) + ) + else: + self.ds = self.ds.where( + self.eval_where(self.where) + ) + self.filter_selection() + if self.verbose: + print(self.selection) + + def save(self): + if self.varname != 'None' and \ + self.varname is not None and \ + not self.write_all: + self.dset[self.varname].to_netcdf(self.output) + else: + self.dset.to_netcdf(self.output) + + def is_float(self, element) -> bool: + try: + float(element) + return True + except ValueError: + return False + + def eval_where(self, where_condition): + eval_cond = None + list_names = list(set( + list(self.ds.keys()) + + list(self.ds.coords.keys())) + ) + wcond = where_condition + check_cond = where_condition + for var in list_names: + wcond = wcond.replace(var, ' self.ds.' + var + ' ') + check_cond = check_cond.replace(var, '') + to_remove = "[><=&|()]" + check_cond = re.sub(to_remove, "", check_cond).replace("!", "") + check_cond = re.sub(' +', ' ', check_cond).strip() + list_flt = check_cond.split(" ") + no_convert = False + for num in list_flt: + if not self.is_float(num): + no_convert = True + if not no_convert: + eval_cond = eval(wcond) + return eval_cond + + +if __name__ == '__main__': + warnings.filterwarnings("ignore") + parser = argparse.ArgumentParser() + parser.add_argument( + 'input', + help='input filename in netCDF format' + ) + parser.add_argument( + 'varname', + help='Specify which variable to plot (case sensitive)' + ) + parser.add_argument( + '--filter', + nargs="*", + help='Filter list variable#operator#value_s#value_e' + ) + parser.add_argument( + '--where', + help='filename with where condition to be evaluated' + ) + parser.add_argument( + '--output', + help='Output filename to store the resulting netCDF file' + ) + parser.add_argument( + '--scale', + help='scale factor to apply to selection (float)' + ) + parser.add_argument( + '--other', + help='Value to use for locations where condition is False (float)' + ) + parser.add_argument( + "--write_all", + help="write all data to netCDF", + action="store_true") + parser.add_argument( + "--keep_attributes", + help="Keep all attributes", + action="store_true") + parser.add_argument( + "-v", "--verbose", + help="switch on verbose mode", + action="store_true") + parser.add_argument( + "--selection", + help="select by values", + action="store_true") + parser.add_argument( + "--drop", + help="drop values where condition is not met", + action="store_true") + args = parser.parse_args() + + print("args.selection", args.selection) + dset = netCDF2netCDF(infile=args.input, varname=args.varname, + scale=args.scale, output=args.output, + write_all=args.write_all, + sel=args.selection, + keep_attributes=args.keep_attributes, + filter_list=args.filter, + where_config=args.where, + drop=args.drop, other=args.other, + verbose=args.verbose) + dset.compute() + dset.save() diff -r 000000000000 -r 810820a0d45c xarray_select.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xarray_select.py Sun Jul 31 21:23:21 2022 +0000 @@ -0,0 +1,294 @@ +# xarray tool for: +# - getting metadata information +# - select data and save results in csv file for further post-processing + +import argparse +import os +import warnings + +import geopandas as gdp + +import pandas as pd + +from shapely.geometry import Point +from shapely.ops import nearest_points + +import xarray as xr + + +class XarraySelect (): + def __init__(self, infile, select="", outfile="", outputdir="", + latname="", latvalN="", latvalS="", lonname="", + lonvalE="", lonvalW="", filter_list="", coords="", + time="", verbose=False, no_missing=False, + tolerance=None): + self.infile = infile + self.select = select + self.outfile = outfile + self.outputdir = outputdir + self.latname = latname + if tolerance != "" and tolerance is not None: + self.tolerance = float(tolerance) + else: + self.tolerance = -1 + if latvalN != "" and latvalN is not None: + self.latvalN = float(latvalN) + else: + self.latvalN = "" + if latvalS != "" and latvalS is not None: + self.latvalS = float(latvalS) + else: + self.latvalS = "" + self.lonname = lonname + if lonvalE != "" and lonvalE is not None: + self.lonvalE = float(lonvalE) + else: + self.lonvalE = "" + if lonvalW != "" and lonvalW is not None: + self.lonvalW = float(lonvalW) + else: + self.lonvalW = "" + self.filter = filter_list + self.time = time + self.coords = coords + self.verbose = verbose + self.no_missing = no_missing + # initialization + self.dset = None + self.gset = None + if self.verbose: + print("infile: ", self.infile) + print("outfile: ", self.outfile) + print("select: ", self.select) + print("outfile: ", self.outfile) + print("outputdir: ", self.outputdir) + print("latname: ", self.latname) + print("latvalN: ", self.latvalN) + print("latvalS: ", self.latvalS) + print("lonname: ", self.lonname) + print("lonvalE: ", self.lonvalE) + print("lonvalW: ", self.lonvalW) + print("filter: ", self.filter) + print("time: ", self.time) + print("coords: ", self.coords) + + def rowfilter(self, single_filter): + split_filter = single_filter.split('#') + filter_varname = split_filter[0] + op = split_filter[1] + ll = float(split_filter[2]) + if (op == 'bi'): + rl = float(split_filter[3]) + if filter_varname == self.select: + # filter on values of the selected variable + if op == 'bi': + self.dset = self.dset.where( + (self.dset <= rl) & (self.dset >= ll) + ) + elif op == 'le': + self.dset = self.dset.where(self.dset <= ll) + elif op == 'ge': + self.dset = self.dset.where(self.dset >= ll) + elif op == 'e': + self.dset = self.dset.where(self.dset == ll) + else: # filter on other dimensions of the selected variable + if op == 'bi': + self.dset = self.dset.sel({filter_varname: slice(ll, rl)}) + elif op == 'le': + self.dset = self.dset.sel({filter_varname: slice(None, ll)}) + elif op == 'ge': + self.dset = self.dset.sel({filter_varname: slice(ll, None)}) + elif op == 'e': + self.dset = self.dset.sel({filter_varname: ll}, + method='nearest') + + def selection(self): + if self.dset is None: + self.ds = xr.open_dataset(self.infile) + self.dset = self.ds[self.select] # select variable + if self.time: + self.datetime_selection() + if self.filter: + self.filter_selection() + + self.area_selection() + if self.gset.count() > 1: + # convert to dataframe if several rows and cols + self.gset = self.gset.to_dataframe().dropna(how='all'). \ + reset_index() + self.gset.to_csv(self.outfile, header=True, sep='\t') + else: + data = { + self.latname: [self.gset[self.latname].values], + self.lonname: [self.gset[self.lonname].values], + self.select: [self.gset.values] + } + + df = pd.DataFrame(data, columns=[self.latname, self.lonname, + self.select]) + df.to_csv(self.outfile, header=True, sep='\t') + + def datetime_selection(self): + split_filter = self.time.split('#') + time_varname = split_filter[0] + op = split_filter[1] + ll = split_filter[2] + if (op == 'sl'): + rl = split_filter[3] + self.dset = self.dset.sel({time_varname: slice(ll, rl)}) + elif (op == 'to'): + self.dset = self.dset.sel({time_varname: slice(None, ll)}) + elif (op == 'from'): + self.dset = self.dset.sel({time_varname: slice(ll, None)}) + elif (op == 'is'): + self.dset = self.dset.sel({time_varname: ll}, method='nearest') + + def filter_selection(self): + for single_filter in self.filter: + self.rowfilter(single_filter) + + def area_selection(self): + + if self.latvalS != "" and self.lonvalW != "": + # Select geographical area + self.gset = self.dset.sel({self.latname: + slice(self.latvalS, self.latvalN), + self.lonname: + slice(self.lonvalW, self.lonvalE)}) + elif self.latvalN != "" and self.lonvalE != "": + # select nearest location + if self.no_missing: + self.nearest_latvalN = self.latvalN + self.nearest_lonvalE = self.lonvalE + else: + # find nearest location without NaN values + self.nearest_location() + if self.tolerance > 0: + self.gset = self.dset.sel({self.latname: self.nearest_latvalN, + self.lonname: self.nearest_lonvalE}, + method='nearest', + tolerance=self.tolerance) + else: + self.gset = self.dset.sel({self.latname: self.nearest_latvalN, + self.lonname: self.nearest_lonvalE}, + method='nearest') + else: + self.gset = self.dset + + def nearest_location(self): + # Build a geopandas dataframe with all first elements in each dimension + # so we assume null values correspond to a mask that is the same for + # all dimensions in the dataset. + dsel_frame = self.dset + for dim in self.dset.dims: + if dim != self.latname and dim != self.lonname: + dsel_frame = dsel_frame.isel({dim: 0}) + # transform to pandas dataframe + dff = dsel_frame.to_dataframe().dropna().reset_index() + # transform to geopandas to collocate + gdf = gdp.GeoDataFrame(dff, + geometry=gdp.points_from_xy(dff[self.lonname], + dff[self.latname])) + # Find nearest location where values are not null + point = Point(self.lonvalE, self.latvalN) + multipoint = gdf.geometry.unary_union + queried_geom, nearest_geom = nearest_points(point, multipoint) + self.nearest_latvalN = nearest_geom.y + self.nearest_lonvalE = nearest_geom.x + + def selection_from_coords(self): + fcoords = pd.read_csv(self.coords, sep='\t') + for row in fcoords.itertuples(): + self.latvalN = row[0] + self.lonvalE = row[1] + self.outfile = (os.path.join(self.outputdir, + self.select + '_' + + str(row.Index) + '.tabular')) + self.selection() + + +if __name__ == '__main__': + warnings.filterwarnings("ignore") + parser = argparse.ArgumentParser() + + parser.add_argument( + 'infile', + help='netCDF input filename' + ) + parser.add_argument( + '--select', + help='Variable name to select' + ) + parser.add_argument( + '--latname', + help='Latitude name' + ) + parser.add_argument( + '--latvalN', + help='North latitude value' + ) + parser.add_argument( + '--latvalS', + help='South latitude value' + ) + parser.add_argument( + '--lonname', + help='Longitude name' + ) + parser.add_argument( + '--lonvalE', + help='East longitude value' + ) + parser.add_argument( + '--lonvalW', + help='West longitude value' + ) + parser.add_argument( + '--tolerance', + help='Maximum distance between original and selected value for ' + ' inexact matches e.g. abs(index[indexer] - target) <= tolerance' + ) + parser.add_argument( + '--coords', + help='Input file containing Latitude and Longitude' + 'for geographical selection' + ) + parser.add_argument( + '--filter', + nargs="*", + help='Filter list variable#operator#value_s#value_e' + ) + parser.add_argument( + '--time', + help='select timeseries variable#operator#value_s[#value_e]' + ) + parser.add_argument( + '--outfile', + help='csv outfile for storing results of the selection' + '(valid only when --select)' + ) + parser.add_argument( + '--outputdir', + help='folder name for storing results with multiple selections' + '(valid only when --select)' + ) + parser.add_argument( + "-v", "--verbose", + help="switch on verbose mode", + action="store_true" + ) + parser.add_argument( + "--no_missing", + help="""Do not take into account possible null/missing values + (only valid for single location)""", + action="store_true" + ) + args = parser.parse_args() + + p = XarraySelect(args.infile, args.select, args.outfile, args.outputdir, + args.latname, args.latvalN, args.latvalS, args.lonname, + args.lonvalE, args.lonvalW, args.filter, + args.coords, args.time, args.verbose, + args.no_missing, args.tolerance) + if args.select: + p.selection()