如何按昼夜分组处理带时间与层级坐标的xarray DataArray数据?
实现方案
xarray与pandas没有内置的昼夜属性可直接用于分组,你可以通过提取time坐标的小时数自定义判断规则,快速完成拆分,两种常用实现方式如下:
前置检查
首先确认你的time坐标为UTC时区,如果未设置时区或为其他时区,可先转换:
# 若time原本就是UTC时间,仅补充时区标记 da['time'] = da.time.dt.tz_localize("UTC") # 若time为其他时区(比如北京时间),转换为UTC # da['time'] = da.time.dt.tz_localize("Asia/Shanghai").dt.tz_convert("UTC")
方法1:布尔索引直接拆分(推荐,适合仅需拆分两个数组的场景)
直接通过小时范围筛选time坐标,一步得到结果:
# 提取UTC时间的小时字段 hour_utc = da.time.dt.hour # 筛选白天数据:6:00 <= 时间 < 18:00 da_day = da.sel(time=(hour_utc >= 6) & (hour_utc < 18)) # 筛选夜间数据:18:00 <= 时间 < 次日6:00 da_night = da.sel(time=~((hour_utc >= 6) & (hour_utc < 18)))
方法2:groupby分组(适合需要后续分组聚合运算的场景)
如果需要后续对昼夜分组做统计(比如求昼夜均值、极值等),可以先新增昼夜标签再分组:
# 新增daynight坐标,标记每个时间点是白天(day)还是夜间(night) da = da.assign_coords( daynight = (da.time.dt.hour >=6) & (da.time.dt.hour <18) ).assign_coords( daynight = lambda x: x.daynight.map({True:"day", False:"night"}) ) # 按昼夜分组 daynight_group = da.groupby("daynight") # 提取对应分组的数据 da_day = daynight_group["day"] da_night = daynight_group["night"] # 也可直接做分组聚合,比如求所有层级的昼夜平均 # daynight_mean = daynight_group.mean(dim="time")
边界调整说明
当前默认规则为:6:00整计入白天、18:00整计入夜间,如有需要可自行修改hour_utc的判断条件调整边界。
内容的提问来源于stack exchange,提问作者Wind Circulation
相关产品推荐
相关产品推荐

