12 月至 1 月的平均日期

问题描述 投票:0回答:1

想象一个在 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()

谢谢!

python datetime time-series average python-datetime
1个回答
3
投票

经过一番谷歌搜索后,我发现您正在寻找的是一种计算圆形量的平均值的方法。更多的谷歌搜索显示,这是在

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功能的文档。

© www.soinside.com 2019 - 2024. All rights reserved.