【问题标题】:xarray - apply a function to the time dimension of a DataArray and add the result as a variablexarray - 将函数应用于 DataArray 的时间维度并将结果添加为变量
【发布时间】:2021-06-27 00:13:51
【问题描述】:

我有一个 DataArray da 和一个名为 FFDI 的变量,它具有三个维度,timelatitudelongitude

xarray.DataArray   'FFDI'   time: 43848   latitude: 2   longitude: 244

latitude     (latitude)     float32           -39.2 -39.163948
longitude    (longitude)    float32           140.8 140.83786 ... 149.96214 150.0
time         (time)         datetime64[ns]    2000-01-01T00:00:00  2000-01-01T01:00:00  ...  2004-12-31T22:00:00  2004-12-31T23:00:00

我想要实现的是将以下函数应用于time 维度的每个时间戳,以计算时间戳是否在夏令时期间并输出布尔值。

def isDST(dt_str):
    local_time_tz = pytz.timezone("Australia/Victoria")
    naive_datetime = datetime.datetime.strptime (dt_str, "%Y-%m-%d %H:%M:%S")
    a = local_time_tz.localize(naive_datetime)
    return bool(a.dst())

输出将是一个 numpy 数组或另一个 DataArray 元素;然后它将作为名为 isDST 的附加变量添加到原始 da。

xarray.DataArray   'FFDI'   time: 43848   latitude: 2   longitude: 244

latitude     (latitude)     float32           -39.2 -39.163948
longitude    (longitude)    float32           140.8 140.83786 ... 149.96214 150.0
time         (time)         datetime64[ns]    2000-01-01T00:00:00  2000-01-01T01:00:00  ...  2004-12-31T22:00:00  2004-12-31T23:00:00
isDST        (time)         bool              true true ... true true

这可能吗?在 xarray、pandas 或 numpy 中应该使用什么函数?

【问题讨论】:

    标签: python pandas numpy python-xarray


    【解决方案1】:

    您可以只使用简单的列表推导并将新坐标添加到DataArray

    import xarray as xr
    import pytz
    
    # example data
    x = xr.tutorial.load_dataset("air_temperature").air
    
    local_time_tz = pytz.timezone("Australia/Victoria")
    is_dst = [bool(local_time_tz.localize(x).dst()) for x in x.time.to_index()]
    x = x.assign_coords(is_dst=("time", is_dst))
    
    # result
    # Coordinates:
    #   * lat      (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0
    #   * lon      (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0
    #   * time     (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00
    #     is_dst   (time) bool True True True True True ... True True True True True
    

    如果 xxarray.Dataset 而不是 xarray.DataArray,您可以这样做:

    x['is_dst'] = [bool(local_time_tz.localize(x).dst()) for x in x.time.to_index()]
    

    【讨论】:

    • 谢谢@Val。抱歉,我忘记了 FFDI 中的时间标签是 UTC。因此,它们将首先转换为带有时区的本地时间。
    • @alextc 你能更新你的问题以显示需要什么吗?我的示例重现了您在问题中的内容
    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2016-09-07
    • 2019-06-28
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多