基于时间片在for循环中创建新数组



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

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循环会产生两个新数组,其中包含20世纪90年代的数据,其名称类似于创建shanghai90s的原始变量shanghai+90s。这是我的东西。

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

然而,这只会创建一个带有最后一个变量的新数组(在本例中为新加坡(。我该怎么解决这个问题?

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

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'])))

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

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

如果你熟悉字典和列表等基本数据结构,你的生活会变得更轻松。这里有很多很棒的教程。我建议字典用这个,清单用这个。

此外,为了跟上这个网站的精神,当你提问时提供MWE是一种很好的礼仪。以下是操作方法。

最新更新