[GRASS-SVN] r62361 - grass/trunk/lib/python/temporal
svn_grass at osgeo.org
svn_grass at osgeo.org
Wed Oct 22 09:50:20 PDT 2014
Author: huhabla
Date: 2014-10-22 09:50:20 -0700 (Wed, 22 Oct 2014)
New Revision: 62361
Modified:
grass/trunk/lib/python/temporal/temporal_granularity.py
Log:
temporal framework: Method for common granule computation implemented
Modified: grass/trunk/lib/python/temporal/temporal_granularity.py
===================================================================
--- grass/trunk/lib/python/temporal/temporal_granularity.py 2014-10-22 16:03:22 UTC (rev 62360)
+++ grass/trunk/lib/python/temporal/temporal_granularity.py 2014-10-22 16:50:20 UTC (rev 62361)
@@ -483,6 +483,248 @@
return None
###############################################################################
+
+def compute_common_absolute_time_granularity(gran_list):
+ """Compute the greatest common granule from a list of absolute time granules
+
+ .. code-block:: python
+
+ >>> import grass.temporal as tgis
+ >>> tgis.init()
+ >>> grans = ["1 second", "2 seconds", "30 seconds"]
+ >>> tgis.compute_common_absolute_time_granularity(grans)
+ '1 seconds'
+
+ >>> grans = ["3 second", "6 seconds", "30 seconds"]
+ >>> tgis.compute_common_absolute_time_granularity(grans)
+ '3 seconds'
+
+ >>> grans = ["12 second", "18 seconds", "30 seconds", "10 minutes"]
+ >>> tgis.compute_common_absolute_time_granularity(grans)
+ '6 seconds'
+
+ >>> grans = ["20 second", "10 minutes", "2 hours"]
+ >>> tgis.compute_common_absolute_time_granularity(grans)
+ '20 seconds'
+
+ >>> grans = ["7200 second", "240 minutes", "1 year"]
+ >>> tgis.compute_common_absolute_time_granularity(grans)
+ '7200 seconds'
+
+ >>> grans = ["7200 second", "89 minutes", "1 year"]
+ >>> tgis.compute_common_absolute_time_granularity(grans)
+ '60 seconds'
+
+ >>> grans = ["10 minutes", "20 minutes", "30 minutes", "40 minutes", "2 hours"]
+ >>> tgis.compute_common_absolute_time_granularity(grans)
+ '10 minutes'
+
+ >>> grans = ["120 minutes", "2 hours"]
+ >>> tgis.compute_common_absolute_time_granularity(grans)
+ '120 minutes'
+
+ >>> grans = ["360 minutes", "3 hours"]
+ >>> tgis.compute_common_absolute_time_granularity(grans)
+ '180 minutes'
+
+ >>> grans = ["2 hours", "4 hours", "8 hours"]
+ >>> tgis.compute_common_absolute_time_granularity(grans)
+ '2 hours'
+
+ >>> grans = ["8 hours", "2 days"]
+ >>> tgis.compute_common_absolute_time_granularity(grans)
+ '8 hours'
+
+ >>> grans = ["48 hours", "1 month"]
+ >>> tgis.compute_common_absolute_time_granularity(grans)
+ '24 hours'
+
+ >>> grans = ["48 hours", "1 year"]
+ >>> tgis.compute_common_absolute_time_granularity(grans)
+ '24 hours'
+
+ >>> grans = ["2 months", "4 months", "1 year"]
+ >>> tgis.compute_common_absolute_time_granularity(grans)
+ '2 months'
+
+ >>> grans = ["120 months", "360 months", "4 years"]
+ >>> tgis.compute_common_absolute_time_granularity(grans)
+ '24 months'
+
+ >>> grans = ["120 months", "361 months", "4 years"]
+ >>> tgis.compute_common_absolute_time_granularity(grans)
+ '1 months'
+
+ >>> grans = ["2 years", "3 years", "4 years"]
+ >>> tgis.compute_common_absolute_time_granularity(grans)
+ '1 years'
+ """
+
+ has_seconds = False # 0
+ has_minutes = False # 1
+ has_hours = False # 2
+ has_days = False # 3
+ has_months = False # 4
+ has_years = False # 5
+
+ seconds = []
+ minutes = []
+ hours = []
+ days = []
+ months = []
+ years = []
+
+ min_gran = 6
+ max_gran = -1
+
+ for entry in gran_list:
+ if not check_granularity_string(entry, "absolute"):
+ return False
+
+ num, gran = entry.split()
+
+ if gran in ["seconds", "second"]:
+ has_seconds = True
+ if min_gran > 0:
+ min_gran = 0
+ if max_gran < 0:
+ max_gran = 0
+
+ seconds.append(int(num))
+
+ if gran in ["minutes", "minute"]:
+ has_minutes = True
+ if min_gran > 1:
+ min_gran = 1
+ if max_gran < 1:
+ max_gran = 1
+
+ minutes.append(int(num))
+
+ if gran in ["hours", "hour"]:
+ has_hours = True
+ if min_gran > 2:
+ min_gran = 2
+ if max_gran < 2:
+ max_gran = 2
+
+ hours.append(int(num))
+
+ if gran in ["days", "day"]:
+ has_days = True
+ if min_gran > 3:
+ min_gran = 3
+ if max_gran < 3:
+ max_gran = 3
+
+ days.append(int(num))
+
+ if gran in ["months", "month"]:
+ has_months = True
+ if min_gran > 4:
+ min_gran = 4
+ if max_gran < 4:
+ max_gran = 4
+
+ months.append(int(num))
+
+ if gran in ["years", "year"]:
+ has_years = True
+ if min_gran > 5:
+ min_gran = 5
+ if max_gran < 5:
+ max_gran = 5
+
+ years.append(int(num))
+
+ if has_seconds:
+ if has_minutes:
+ minutes.sort()
+ seconds.append(minutes[0]*60)
+ if has_hours:
+ hours.sort()
+ seconds.append(hours[0]*60*60)
+ if has_days:
+ days.sort()
+ seconds.append(days[0]*60*60*24)
+ if has_months:
+ months.sort()
+ seconds.append(months[0]*60*60*24*28)
+ seconds.append(months[0]*60*60*24*29)
+ seconds.append(months[0]*60*60*24*30)
+ seconds.append(months[0]*60*60*24*31)
+ if has_years:
+ years.sort()
+ seconds.append(years[0]*60*60*24*365)
+ seconds.append(years[0]*60*60*24*366)
+
+ num = gcd_list(seconds)
+ return "%i %s"%(num, "seconds")
+
+ elif has_minutes:
+ if has_hours:
+ hours.sort()
+ minutes.append(hours[0]*60)
+ if has_days:
+ days.sort()
+ minutes.append(days[0]*60*24)
+ if has_months:
+ months.sort()
+ minutes.append(months[0]*60*24*28)
+ minutes.append(months[0]*60*24*29)
+ minutes.append(months[0]*60*24*30)
+ minutes.append(months[0]*60*24*31)
+ if has_years:
+ years.sort()
+ minutes.append(years[0]*60*24*365)
+ minutes.append(years[0]*60*24*366)
+ num = gcd_list(minutes)
+ return "%i %s"%(num, "minutes")
+
+ elif has_hours:
+ if has_days:
+ days.sort()
+ hours.append(days[0]*24)
+ if has_months:
+ months.sort()
+ hours.append(months[0]*24*28)
+ hours.append(months[0]*24*29)
+ hours.append(months[0]*24*30)
+ hours.append(months[0]*24*31)
+ if has_years:
+ years.sort()
+ hours.append(years[0]*24*365)
+ hours.append(years[0]*24*366)
+ num = gcd_list(hours)
+ return "%i %s"%(num, "hours")
+
+ elif has_days:
+ if has_months:
+ months.sort()
+ days.append(months[0]*28)
+ days.append(months[0]*29)
+ days.append(months[0]*30)
+ days.append(months[0]*31)
+ if has_years:
+ years.sort()
+ days.append(years[0]*365)
+ days.append(years[0]*366)
+ num = gcd_list(days)
+ return "%i %s"%(num, "days")
+
+ elif has_months:
+ if has_years:
+ years.sort()
+ months.append(years[0]*12)
+ num = gcd_list(months)
+ return "%i %s"%(num, "months")
+
+ elif has_years:
+ num = gcd_list(years)
+ return "%i %s"%(num, "years")
+
+
+###############################################################################
# http://akiscode.com/articles/gcd_of_a_list.shtml
# Copyright (c) 2010 Stephen Akiki
# MIT License (Means you can do whatever you want with this)
More information about the grass-commit
mailing list