2014-09-19 173 views
1

想象一下,一个时间序列在12月底/ 1月初左右出现周期性峰值。然后系列的最大值将具有如下所示的日期,如dt1dt2所示。我需要计算这些最大值的(DOY)的平均日期12月至1月的一年中的平均日期

问题是,dt1(211)和dt2(356)的正常平均值会给出非常不同的结果。原因很明显,dt1的一些元素是在1月份,所以相应的DOY非常小,并且导致平均值下降。

我最初的工作是围绕使用另一个月作为原点来计算DOY,但是这造成了其他时间序列在新原点附近达到峰值的问题。

是否有一般的,常年解决这个问题?

dt1 = [datetime(2000, 12, 15), datetime(2001, 12, 16), datetime(2002,12,20), datetime(2004,1,2) , datetime(2005,1,1)] 
dt2 = [datetime(2000, 12, 15), datetime(2001, 12, 16), datetime(2002,12,20), datetime(2003,12,31), datetime(2004,12,30)] 
doys1 = np.array([dt.timetuple().tm_yday for dt in dt1]) 
doys2 = np.array([dt.timetuple().tm_yday for dt in dt2]) 
print doys1.mean() 
print doys2.mean() 

谢谢!

回答

2

经过一番谷歌搜索,我发现你正在寻找的是一种方法来计算mean of circular quantities。还有一些Google搜索显示这是在scipy library中执行的。我已经找到了它,这要归功于this answer,但是我试图找到一些关于函数本身的正确文档,并返回检查source code以找出应该如何调用它。

>>> import numpy as np 
>>> from scipy import stats 
>>> from datetime import datetime 
>>> 
>>> dt1 = [datetime(2000, 12, 15), datetime(2001, 12, 16), datetime(2002,12,20), datetime(2004,1,2) , datetime(2005,1,1)] 
>>> dt2 = [datetime(2000, 12, 15), datetime(2001, 12, 16), datetime(2002,12,20), datetime(2003,12,31), datetime(2004,12,30)] 
>>> doys1 = np.array([dt.timetuple().tm_yday for dt in dt1]) 
>>> doys2 = np.array([dt.timetuple().tm_yday for dt in dt2]) 
>>> 
>>> stats.circmean(doys1, high=365) 
357.39332727199502 
>>> stats.circmean(doys2, high=365) 
356.79551148217894 
+0

谢谢,@Yoel!这就像一个魅力。 – Cronopio 2014-09-19 22:57:03

相关问题