Я новичок в Python, поэтому вполне возможно, что мой вопрос уже задавался в сети, но когда я нахожу вещи, которые кажутся актуальными, я не всегда знаю, как использовать их в своем коде (особенно если это определение функции), поэтому прошу прощения за избыточность.
Я работаю с ежедневными данными о температуре с веб-сайта Copernicus (https://marine.copernicus.eu/).
Поскольку файлы netCDF слишком велики, и если мне нужны данные за каждый день каждого месяца в течение нескольких лет, я пытаюсь получить доступ к данным, не загружая их, чтобы я мог работать с ними. это.
Данные представлены в виде массива за 1 день месяца года.
Я хочу суммировать значения всех массивов для каждого дня месяца в году.
Чтобы было понятнее, вот пример:
Упрощенные массивы:
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_length0 выглядят так:
На 01.01.2014:
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]]])
На 01.02.2014:
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]]])
И я получаю day_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 но либо он не предназначен для того, что я хочу сделать, либо я делаю это неправильно, особенно когда речь идет о хранении массива с суммой в переменной.
Я добавил пустой_массив = np.array([]) перед циклом for, но я не знаю, что делать дальше в цикле.
Я впервые обрабатываю массивы с Python, так что, возможно, я делаю это неправильно.
В конце концов, мне хотелось бы усреднить значения моих разных массивов за месяц.
Упрощенный пример с тремя днями месяца:
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])
Подробнее здесь: https://stackoverflow.com/questions/789 ... ith-python