想象一个时间序列在12月底/ 1月初周期性地达到峰值。系列的最大值将具有下面dt1
或dt2
中显示的日期。我需要计算那些最大值的一年中的平均值(DOY)。
问题是,正常平均值会给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()
谢谢!
答案 0 :(得分:2)
经过一番谷歌搜索后,我发现你正在寻找的是一种计算mean of circular quantities的方法。更多的谷歌搜索透露,这是在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