【问题标题】:Xarray Pandas dayofyear producing incorrect dimensions with leap yearsXarray Pandas dayofyear 在闰年产生不正确的尺寸
【发布时间】:2019-09-22 07:02:56
【问题描述】:

我正在尝试使用 xarray 将每小时气候数据汇总为年度文件的每日平均值。但是,我用“水年”而不是日历年来分隔它们——从 10 月 1 日到 9 月 30 日。

当我尝试使用“groupby(.dayofyear)”方法时,它会在开始或结束日期在实际闰年之内的水年中产生不正确的“dayofyear”维度。

例如,对于跨越闰日的 2000 年水年 (10/01/1999 - 09/30/2000),生成的代码会生成大小为 365 的年日维度,而不是 366。在计算 2001 年水年时(10/01/2000 - 09/30/2001),它不跨越闰日,它会产生不正确的尺寸大小 366 而不是 365。

我确信我可以从头开始构建数组,但我希望有一个内置函数或其他简单的方法来解决这个问题。

new_array['TMEAN'] = d['T2'].groupby('XTIME.dayofyear').mean(dim='Time')

【问题讨论】:

  • MWE 将有助于诊断 dayofyear 发生的情况;但是,最终我认为resample 可能更适合您的需求(从每小时到每天的频率下采样)。查看示例here
  • @spencerkclark 感谢您的回复。 resample 函数看起来就像我想要的那样。但是,“XTIME”是一个坐标,而不是一个维度,并且“时间”维度是“Int64Index”格式,这会引发错误“TypeError:仅对 DatetimeIndex、TimedeltaIndex 或 PeriodIndex 有效,但有一个“Int64Index”实例。您知道解决方法吗?
  • @spencerkclark 非常感谢您的全面回答!有效的解决方案。

标签: python pandas datetime python-xarray


【解决方案1】:

当然——这是一个使用resample 执行此操作的简短示例。我们将首先构造一个与您的结构具有相似结构的 DataArray。

import numpy as np
import pandas as pd
import xarray as xr

ntimes = 24000
time = np.arange(ntimes)
times = xr.DataArray(pd.date_range('2000', periods=ntimes, freq='H'))
xtime = xr.DataArray(times, dims=['time'], coords=[time], name='XTIME')
da = xr.DataArray(np.random.random(ntimes), dims=['time'], coords=[time], name='T2')
da['XTIME'] = xtime

这里da 由名为'time' 的维度索引,其坐标为整数。它还有一个名为'XTIME'的日期时间坐标:

<xarray.DataArray 'T2' (time: 24000)>
array([0.285948, 0.046776, 0.0814  , ..., 0.47595 , 0.241202, 0.453325])
Coordinates:
  * time     (time) int64 0 1 2 3 4 5 6 ... 23994 23995 23996 23997 23998 23999
    XTIME    (time) datetime64[ns] 1999-01-01 ... 2001-09-26T23:00:00

要使用resample,我们需要将'XTIME' 设为DataArray 中的维度坐标,而不是'time'。一个有用的方法是swap_dims:

result = da.swap_dims({'time': 'XTIME'}).resample(XTIME='D').mean()

result 然后看起来像:

<xarray.DataArray 'T2' (XTIME: 1000)>
array([0.487798, 0.422622, 0.497371, ..., 0.487836, 0.500065, 0.482849])
Coordinates:
  * XTIME    (XTIME) datetime64[ns] 1999-01-01 1999-01-02 ... 2001-09-26

那么,如果我理解正确的话,将事物分成“水年”只是一个子集result的问题,例如:

water_year_2000 = result.sel(XTIME=slice('1999-10-01', '2000-09-30'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多