2014-09-19 170 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

相關問題