xarray 数据集的两年平均值

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

我有一个名为

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
python datetime average python-xarray resample
1个回答
0
投票

您可以使用 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 日期时间系列。

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