From 5d7aa1201b5b59f0954f60cb44847d278ee59ef3 Mon Sep 17 00:00:00 2001
From: Wouter Peters <wouter.peters@wur.nl>
Date: Wed, 12 Jun 2013 10:22:41 +0000
Subject: [PATCH] new routines for time averaging of cycle files

---
 gridded/da/analysis/daily_fluxes.py   | 62 ++++++++++++++++++++++
 gridded/da/analysis/monthly_fluxes.py | 76 +++++++++++++++++++++++++++
 gridded/da/analysis/yearly_fluxes.py  | 76 +++++++++++++++++++++++++++
 3 files changed, 214 insertions(+)
 create mode 100755 gridded/da/analysis/daily_fluxes.py
 create mode 100755 gridded/da/analysis/monthly_fluxes.py
 create mode 100755 gridded/da/analysis/yearly_fluxes.py

diff --git a/gridded/da/analysis/daily_fluxes.py b/gridded/da/analysis/daily_fluxes.py
new file mode 100755
index 0000000..ebe7d56
--- /dev/null
+++ b/gridded/da/analysis/daily_fluxes.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+# daily_fluxes.py
+
+"""
+Author : peters 
+
+Revision History:
+File created on 20 Dec 2012.
+
+"""
+import sys
+sys.path.append('../../')
+import os
+import sys
+import shutil
+import datetime
+
+def daily_avg(rundir,avg):
+    """ Function to create a set of daily files in a folder, needed to make longer term means """
+    
+    if avg not in ['transcom','olson']:
+        raise IOError,'Choice of averaging invalid'
+    if no os.path.exists(rundir):
+        raise IOError,'rundir requested (%s) does not exist, exiting...'%rundir
+
+    weekdir = os.path.join(rundir + 'data_%s_weekly'%avg)
+    files  = os.listdir(weekdir)
+    
+    daydir = os.path.join(rundir + 'data_%s_daily'%avg)
+    if not os.path.exists(daydir):
+        print "Creating new output directory " + daydir
+        os.makedirs(daydir)
+
+    files = [f for f in files if '-' in f]
+
+    fileinfo = {}
+    for filename in files:
+        date=datetime.datetime.strptime(filename.split('.')[-2],'%Y-%m-%d')
+        fileinfo[filename] = date
+    
+    dt = fileinfo[files[1]] - fileinfo[files[0]]
+
+    for k,v in fileinfo.iteritems():
+        cycle_file = os.path.join(weekdir,k)
+        for i in range(dt.days):
+            daily_file = os.path.join(daydir,'%s_fluxes.%s.nc'%(avg,(v+datetime.timedelta(days=i)).strftime('%Y-%m-%d')))
+            if not os.path.lexists(daily_file):
+                os.symlink(cycle_file,daily_file)
+                print daily_file,cycle_file
+
+
+if __name__ == "__main__":
+
+    rundir  = "/Storage/CO2/ivar/zeus_output/ICDC9/ctdas_co2c13_terdisbcb_manscale/analysis/"
+
+    try:
+        avg=sys.argv[1]
+    except:
+        avg='transcom'
+
+    daily_avg(rundir,avg)
+
diff --git a/gridded/da/analysis/monthly_fluxes.py b/gridded/da/analysis/monthly_fluxes.py
new file mode 100755
index 0000000..5b1299f
--- /dev/null
+++ b/gridded/da/analysis/monthly_fluxes.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+# daily_fluxes.py
+
+"""
+Author : peters 
+
+Revision History:
+File created on 20 Dec 2012.
+
+"""
+
+import os
+import sys
+import datetime
+from dateutil.relativedelta import relativedelta
+import subprocess
+
+def monthly_avg(rundir,avg):
+    """ Function to average a set of files in a folder from daily to monthly means """
+    
+    if avg not in ['transcom','olson']:
+        raise IOError,'Choice of averaging invalid'
+    if no os.path.exists(rundir):
+        raise IOError,'rundir requested (%s) does not exist, exiting...'%rundir
+
+    daydir = rundir + 'data_%s_daily'%avg
+    files  = os.listdir(daydir)
+    monthdir = os.path.join(rundir,'data_%s_monthly'%avg)
+    if not os.path.exists(monthdir):
+        print "Creating new output directory " + monthdir
+        os.makedirs(monthdir)
+        sd = datetime.datetime(1999,1,1)
+    else: 
+        files_monthly = os.listdir(monthdir)
+        files_monthly.sort()
+        fm = files_monthly[-1]
+        #sd = datetime.datetime(int(fm[9:13]),int(fm[14:16]),1)
+        sd = datetime.datetime.strptime(fm.split('.')[-2],'%Y-%m')
+    print sd
+            
+    files = [f for f in files if '-' in f]
+
+    fileinfo = {}
+    for filename in files:
+        date=datetime.datetime.strptime(filename.split('.')[-2],'%Y-%m-%d')
+        fileinfo[filename] = date
+
+    years = [d.year for d in fileinfo.values()]
+    months = set([d.month for d in fileinfo.values()])
+    
+    if sd > datetime.datetime(1999,2,1):
+        sd = sd + relativedelta(months=+1)
+    else: sd = datetime.datetime(min(years),1,1)
+    ed = datetime.datetime(max(years)+1,1,1)
+
+    while sd < ed: 
+
+        nd = sd + relativedelta(months=+1)
+        
+        avg_files = [os.path.join(daydir,k) for k,v in fileinfo.iteritems() if v < nd and v >= sd]
+        print sd, nd , len(avg_files)
+       
+        if len(avg_files) > 0: 
+            command = ['ncra']+ avg_files + [os.path.join(monthdir,'%s_fluxes.%s.nc'%(avg,sd.strftime('%Y-%m')))]
+        
+            status = subprocess.check_call(command)
+
+        sd = nd
+
+if __name__ == "__main__":
+
+    rundir = "/Storage/CO2/ivar/zeus_output/ICDC9/ctdas_co2c13_terdisbcbmanscale_neweps449_test/analysis/"
+    try:
+        avg=sys.argv[1]
+    except:
+        avg='transcom'
diff --git a/gridded/da/analysis/yearly_fluxes.py b/gridded/da/analysis/yearly_fluxes.py
new file mode 100755
index 0000000..ba47da2
--- /dev/null
+++ b/gridded/da/analysis/yearly_fluxes.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+# daily_fluxes.py
+
+"""
+Author : peters 
+
+Revision History:
+File created on 20 Dec 2012.
+
+"""
+
+import os
+import sys
+import datetime
+from dateutil.relativedelta import relativedelta
+import subprocess
+
+def yearly_avg(rundir,avg):
+    """ Function to average a set of files in a folder from monthly to yearly means """
+
+    if avg not in ['transcom','olson']:
+        raise IOError,'Choice of averaging invalid'
+    if no os.path.exists(rundir):
+        raise IOError,'rundir requested (%s) does not exist, exiting...'%rundir
+
+    monthdir = rundir + 'data_%s_monthly'%avg
+    files  = os.listdir(monthdir)
+    yeardir = os.path.join(rundir,'data_%s_yearly'%avg)
+    if not os.path.exists(yeardir):
+        print "Creating new output directory " + yeardir
+        os.makedirs(yeardir)
+        sd = datetime.datetime(1999,1,1)
+    else: 
+        files_yearly = os.listdir(monthdir)
+        files_yearly.sort()
+            
+    files = [f for f in files if '-' in f]
+
+    fileinfo = {}
+    for filename in files:
+        date=datetime.datetime.strptime(filename.split('.')[-2],'%Y-%m')
+        fileinfo[filename] = date
+
+    years = set([d.year for d in fileinfo.values()])
+    
+    sd = datetime.datetime(min(years),1,1)
+    ed = datetime.datetime(max(years)+1,1,1)
+
+    while sd < ed: 
+
+        nd = sd + relativedelta(years=+1)
+        
+        avg_files = [os.path.join(monthdir,k) for k,v in fileinfo.iteritems() if v < nd and v >= sd]
+        print sd, nd , len(avg_files)
+       
+        if len(avg_files) > 0 : 
+            command = ['ncra']+ avg_files + [os.path.join(yeardir,'%s_fluxes.%s.nc'%(avg,sd.strftime('%Y')))]
+        
+            status = subprocess.check_call(command)
+
+        sd = nd
+
+
+
+if __name__ == "__main__":
+
+    
+    rundir = "/Storage/CO2/ivar/zeus_output/ICDC9/ctdas_co2c13_terdisbcbmanscale_neweps449_test/analysis/"
+
+    try:
+        avg=sys.argv[1]
+    except:
+        avg='transcom'
+
+    yearly_avg(rundir,avg)
+
-- 
GitLab