我有一个名为
DataList
的 xarray 数据,其中包含 "time"
和 "value"
变量。
我的目标是从 10 年的数据中得出两年的平均值。一年平均值效果很好,但在尝试两年平均值时遇到了问题。
"time"
为 datetime64 格式,每小时数据从:开始
print(DataList["time"][0])
2014-01-01T00:00:00.000000000
结束于:
print(DataList["time"][-1])
2023-12-31T23:00:00.000000000
当我尝试使用以下代码计算一年平均值时,它运行得很好:
YearlyAverage = DataList["Value"].resample(time = "1Y").mean(dim="time")
我获得以下时间步长的总共 10 个值,其中一个值在每年的最后一天。
2014-12-31, 2015-12-31, ... 2023-12-31
现在来说说问题。如果我想产生两年平均值而不是一年平均值,我尝试将
.resample(time = "1Y")
更改为 .resample(time = "2Y")
,这几乎有效,但它为我提供了错误的时间。它首先计算 2014 年的单年平均值,然后继续计算 2015-2016、2017-2018、2019-2020、2021-2022、2023-2024 的两年平均值,我总共得到六个值。
2014-12-31, 2016-12-31, 2018-12-31, 2020-12-31, 2022-12-31, 2024-12-31
第一个和最后一个时间步长是单年2014年和2023年的平均值。我的数据中不存在2013年和2024年。好像平均计算是从 2013 年开始的(这就是为什么它在 2014 年结束),但我的数据中不存在 2013 年,所以我不知道发生了什么。如果一开始就有错误的值我会理解,但我的数据中的第一个时间步肯定是在 2014 年。
那么为什么它不会自动执行此操作,我该如何修复它以获得以下时间输出?
2015-12-31, 2017-12-31, 2019-12-31, 2021-12-31, 2023-12-31
这些步骤代表
2014-2015, 2016-2017, 2018-2019, 2020-2021, 2022-2023
的两年平均值
当然,对于像这样的小数据,手动完成很容易,但我很好奇,如果我遇到较大数据的类似问题,为什么会发生这种情况。因此,如果有人有任何想法,我非常感激!
这是一个重现问题的示例代码片段,它创建了与我的问题相同的列表:
import random as rnd
import pandas as pd
import xarray as xr
datelist = pd.date_range(start ='01-01-2014',end ='01-01-2024', freq ='1H')
datelist = datelist.tolist()
datelist.pop() # remove last value so datelist ends at 23.00 on 31-12-2023
values = []
n = 87648
for i in range(n):
values.append(rnd.randint(0,10)) # list of values
DataList = xr.Dataset(
{
"time": (["time"], datelist),
"Value": (["time"],values,{"units": "-"}),
}
)
Values_1Y = DataList["Value"].resample(time = "1Y").mean(dim="time")
print(Values_1Y["time"])
# this is absolutely correct
# first year average is taken at the end
# of first year: 2014-12-31T00:00:00.000000000
Values_2Y = DataList["Value"].resample(time = "2Y").mean(dim="time")
print(Values_2Y["time"])
# this results in the first step being
# 2014-12-31T00:00:00.000000000 (should be end of 2015)
# and last step 2024-12-31T00:00:00.000000000
您可以使用 2YS
而不是
2Y
来指定从 start开始的 2 年期间进行重采样:
Values_2Y = DataList["Value"].resample(time="2YS").mean(dim="time")
print(Values_2Y["time"])
<xarray.DataArray 'time' (time: 5)> Size: 40B
array(['2014-01-01T00:00:00.000000000', '2016-01-01T00:00:00.000000000',
'2018-01-01T00:00:00.000000000', '2020-01-01T00:00:00.000000000',
'2022-01-01T00:00:00.000000000'], dtype='datetime64[ns]')
Coordinates:
* time (time) datetime64[ns] 40B 2014-01-01 2016-01-01 ... 2022-01-01
如果您想将间隔标签“居中”,可以通过 timedelta 算术来实现(如果您处理每年的间隔,请小心闰年;-)):
print(Values_2Y["time"] + pd.Timedelta(days=365))
<xarray.DataArray 'time' (time: 5)> Size: 40B
array(['2015-12-31T00:00:00.000000000', '2017-12-31T00:00:00.000000000',
'2019-12-31T00:00:00.000000000', '2021-12-31T00:00:00.000000000',
'2023-12-31T00:00:00.000000000'], dtype='datetime64[ns]')
Coordinates:
* time (time) datetime64[ns] 40B 2014-12-31 2016-12-31 ... 2022-12-31
考虑使用 pandas DateOffsets - 但这不能直接与 xarray 一起使用;你必须首先提取 pandas 日期时间系列。