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

Python 基于时间片在for循环中创建新数组,python,loops,datetime,Python,Loops,Datetime,我有一个网格数据集,其中lat、lon、time和temperature是变量。我想看一些基于十年数据的分布。例如,假设我想看看上海和新加坡的一个地点 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.da

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

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+90s,以创建shanghai90s。这是我的

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'])))
cities["Shangai"]["1990s"]
然后,您可以通过以下方式访问Shangai的90年代数据:

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'])))
cities["Shangai"]["1990s"]
如果您熟悉字典和列表等基本数据结构,您的生活就会轻松得多。有很多很棒的教程。我建议你查字典,查清单


此外,为了跟上本网站的精神,在提问时提供MWE是一种良好的礼仪

这可能是因为每次它在循环中运行时,您都在重新定义九。因此,每当你运行这个程序时,九总是循环最后一次运行的结果,在这种情况下,当names[i]==singapore时。我如何防止它+能够使用我想要的命名约定?你可以创建一个名为九的列表或元组,包含所有新数组,并使用索引位置来访问它们。例如:nine.appendnames[i].seltime=slicestart_date1,end_date1我需要避免名称中的重复性,因为我也想看看其他的十年。我将如何使用这个for循环,同时将新变量名设置为类似“shanghai90s”或“singapore90s”等。最终我将有“shanghai90s”、“shanghai00s”和“shanghai10s”。编辑:我也不熟悉字典。如果你不介意的话,你能举一个字典的例子吗?如果没有,那没关系。哇,谢谢你。我肯定会对字典更感兴趣。我在使用你提供的代码时遇到了一些问题。我首先得到了这个错误:-->4城市[decade]=data.seltime=slicedates['start'],dates['end']TypeError:'str'对象不支持项目分配,然后我将其编辑为城市[decade]+=data。。。。这导致了一个新的错误:TypeError:字符串索引必须是integersOoops。我的错误。修好了。还修复了第二个位置参数。这就是为什么提供MWE非常有用的原因。然后,人们可以在发表之前检查他们的答案:这仍然是我的错,我希望你能理解: