想象一个在 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()
谢谢!
经过一番谷歌搜索后,我发现您正在寻找的是一种计算圆形量的平均值的方法。更多的谷歌搜索显示,这是在
scipy
库 中实现的。感谢这个答案,我找到了它,但是我在尝试找到有关该函数本身的一些正确文档时失败了,并转而检查源代码以找出应该如何调用它。
>>> 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
编辑:
可在
此处获取
scipy.stats.circmean
功能的文档。