首页 > 解决方案 > 基于时间片在for循环中创建新数组

问题描述

我有一个网格数据集,其中纬度、经度、时间和温度是变量。我想看看基于十年数据的一些分布。例如,假设我想查看上海和新加坡的某个位置。

shanghai = temp.sel(latitude=31.25, longitude=121.5)
singapore = temp.sel(latitude=1.25, longitude=103.75)

现在我设置开始和结束日期。

start_date1 = dt.datetime(1990,1,1)
end_date1 = dt.datetime(1999,12,31)

现在我想创建一个循环,这样我就不必在切片两个温度数组时进行硬编码。理想情况下,从 for 循环中吐出的是两个新数组,其中包含 1990 年代的数据,其名称类似于原始变量shanghai+ 90sto create shanghai90s。这就是我所拥有的。

names = [shanghai, singapore]

for i in range(len(names)):
    nine=names[i].sel(time=(slice(start_date1,end_date1)))

但是,这只会创建一个带有最后一个变量的新数组(在本例中为新加坡)。我将如何解决这个问题?

标签: pythonloopsdatetime

解决方案


将所有城市数据保存在字典中会更好,但一种快速的方法是更新数组以仅包含您想要的日期:

names = [shanghai, singapore]

for city in names:
    city=city.sel(time=(slice(start_date1,end_date1)))

字典方法会让你预先做一些工作来设置坐标和几十年,然后让你遍历所有城市和几十年来构建你想要的所有数据的字典。它看起来像这样:

import datetime as dt
cities = {
    "Shangai": {"coords": [31.25, 121.5]},
    "Singapore": {"coords": [1.25, 103.75]},
    "Other City": {"coords": [15.25, 85.25]}
}

decades = {
    "1990s": {"start": dt.datetime(1990,1,1), "end": dt.datetime(1999,12,31)},
    "2000s": {"start": dt.datetime(2000,1,1), "end": dt.datetime(2009,12,31)},
    "2010s": {"start": dt.datetime(2010,1,1), "end": dt.datetime(2019,12,31)}
}

for city, location in cities.items():
    data = temp.sel(latitude=location['coords'][0], longitude=location['coords'][1])
    for decade, dates in decades.items():
        cities[city][decade] = data.sel(time=(slice(dates['start'], dates['end'])))

然后你可以像这样访问上海的 90 年代数据:

cities["Shangai"]["1990s"]

如果您熟悉字典和列表等基本数据结构,那真的会让您的生活更轻松。有很多很棒的教程。我建议将其用于字典,将其用于列表。

此外,为了跟上本网站的精神,在您提问时提供 MWE 是一种很好的礼仪。这是如何做到的


推荐阅读