我对Python相当陌生,所以很可能我的问题已经在网上被问过,但是当我发现似乎相关的东西时,我并不总是知道如何在我的代码中使用它们(特别是如果它是一个函数)定义),所以如果有任何冗余,我深表歉意。
我使用哥白尼网站 (https://marine.copernicus.eu/) 的每日温度数据。
如果我想要几年内每个月每天的数据,由于 netCDF 文件太大,我想做的是访问数据而不下载数据,以便我可以使用它。
数据以数组的形式表示一年中一个月中的第一天。
我想对一年中每个月的每一天的所有数组的值求和。
为了让事情更清楚,这里有一个例子:
简化数组:
array1([1,4,3,9]
[7,5,2,3])
array2([3,8,6,1]
[6,4,7,2])
#... etc until day 28,29,30 or 31
我想要的结果:
array1 + array 2 => ([1+3,4+8,3+6,9+1]
[7+6,5+4,2+7,3+2])
array1 + array 2 => ([4,12,9,10]
[13,9,9,5])
我首先尝试在没有循环的情况下使用数据 2 天,结果成功了。
我的代码:
import os
import xarray as xr
import numpy as np
import netCDF4 as nc
import copernicusmarine
# Access the data
DS = copernicusmarine.open_dataset(dataset_id="cmems_mod_glo_phy_my_0.083deg_P1D-m")
# Get only thetao (temperature) variable for 1 day
subset = DS[['thetao']].sel(time = slice("2014-01-01", "2014-01-01"))
# Obtain only data of a certain depth
target_depth = 0 #surface
subset_T = subset.thetao.isel(depth=target_depth)
# To view my data in array
thetao_depth0 = subset_T.data
thetao_depth0
# Same thing for next day of the same month and year
subset2 = DS[['thetao']].sel(time = slice("2014-01-02", "2014-01-02"))
subset_T2 = subset2.thetao.isel(depth=target_depth)
thetao_depth0_2 = subset_T2.data
thetao_depth0_2
# The sum of my arrays
days_sum = thetao_depth0 + thetao_depth0_2
days_sum
我的 thetao_depth0 数组如下所示:
2014 年 1 月 1 日:
array([[[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
...,
[-1.70870081, -1.70870081, -1.70870081, ..., -1.70870081,
-1.70870081, -1.70870081],
[-1.71016569, -1.71016569, -1.71016569, ..., -1.71016569,
-1.71016569, -1.71016569],
[ nan, nan, nan, ..., nan,
nan, nan]]])
2014 年 2 月 1 日:
array([[[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
...,
[-1.70870081, -1.70870081, -1.70870081, ..., -1.70870081,
-1.70870081, -1.70870081],
[-1.71016569, -1.71016569, -1.71016569, ..., -1.71016569,
-1.71016569, -1.71016569],
[ nan, nan, nan, ..., nan,
nan, nan]]])
我得到了 days_sum :
array([[[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
...,
[-3.41740161, -3.41740161, -3.41740161, ..., -3.41740161,
-3.41740161, -3.41740161],
[-3.42033139, -3.42033139, -3.42033139, ..., -3.42033139,
-3.42033139, -3.42033139],
[ nan, nan, nan, ..., nan,
nan, nan]]])
现在事情变得复杂了。
我想创建一个循环,对一年中每个月的每一天(例如从 01/01/2014 到 31/01/2014)的所有数组执行相同的操作。
到目前为止我已经做到了:
day = ['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31']
month = ['01']
year = ['2014']
DS = copernicusmarine.open_dataset(dataset_id="cmems_mod_glo_phy_my_0.083deg_P1D-m")
for y in year:
for m in month:
for d in day:
start_date="%s"%y+"-%s"%m+"-%s"%d
end_date=start_date
subset_thetao = DS[['thetao']].sel(time = slice(start_date, end_date))
target_depth = 0
subset_depth = subset_thetao.thetao.isel(depth=target_depth)
thetao_depth0 = subset_depth.data
但是我在添加每轮循环的数组时遇到困难。
我第一次尝试使用
np.sum
,但要么它不是为我想做的事情而设计的,要么我做错了,特别是当涉及到将数组与总和存储在变量中时。empty_array = np.array([])
,但我不知道循环中下一步要做什么。
这是我第一次用python处理数组,所以也许我做错了。
最后,我想做的是对一个月内不同数组的值进行平均。
每月 3 天的简化示例:
array1([1,4,3,9]
[7,5,2,3])
array2([3,8,6,1]
[6,4,7,2])
array3([3,2,6,1]
[1,4,5,2])
获取:
array([(1+3+3)/3,(4+8+2)/3,...etc]
[...etc])
array([2.3,4.6,5,3.6]
[4.6,4.3,4.6,2.3])
不确定,但尝试一次
target_depth = 0
result = []
for y in year:
for m in month:
for d in day:
start_date="%s"%y+"-%s"%m+"-%s"%d
end_date=start_date
subset_thetao = DS[['thetao']].sel(time = slice(start_date, end_date))
subset_depth = subset_thetao.thetao.isel(depth=target_depth)
thetao_depth0 = subset_depth.data
result = result + thetao_depth0
print(result)