#datetime #netcdf #python-xarray
#datetime #netcdf #python-xarray
Вопрос:
У меня есть файл netcdf, содержащий месячные значения осадков с 1948 по 2008 год. Переменная времени имеет формат, как показано ниже:
float time(time) ;
time:units = "months since 1948-01-01 00:00:00" ;
time:time_origin = "01-JAN-1948:00:00:00" ;
Когда я пытаюсь использовать Xarray для открытия набора данных с помощью следующей команды
ds=xr.open_dataset("C:/Users/vsri/Downloads/prcp_monthly_1948-2008.nc")
Я получаю следующую ошибку
ValueError: unable to decode time units 'months since 1948-01-01 00:00:00' with the default calendar. Try opening your dataset with decode_times=False.
Если я использую аргумент decode_Times=False , переменной time присваивается значение с плавающей запятой (как показано ниже)
Coordinates:
* longitude (longitude) float32 0.25 0.75 1.25 1.75 ... 358.75 359.25 359.75
* latitude (latitude) float32 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75
* z (z) float32 0.0
* time (time) float32 0.0 1.0 2.0 3.0 4.0 ... 728.0 729.0 730.0 731.0
Я не хочу использовать decode_Times=False, потому что я больше не могу использовать функцию повторной выборки xarray для набора данных.
Может кто-нибудь подсказать мне, как убедиться, что xarray считывает набор данных с правильной отметкой времени, а не с плавающей запятой?
Комментарии:
1. Обратите внимание, что существует разница между «календарным месяцем» и «месяцем», определенным соглашениями CF . Календарный месяц варьируется по длине в зависимости от конкретного месяца, в то время как месяц в соглашениях CF всегда имеет одинаковую длину. Из-за этого несоответствия xarray решает не пытаться автоматически декодировать время с помощью этих единиц измерения. Однако обойти это просто, поэтому я должен быть в состоянии дать ответ. Я предполагаю, что единицы измерения в этом файле соответствуют календарным месяцам?
2. @spencerkclark: Спасибо за ваши разъяснения. В этом случае я не уверен, имеет ли это значение, поскольку данные составляют одно значение в месяц. Итак, 732 месяца за период времени 1948-2008. Прошу прощения, если я неправильно понимаю концепцию. Каков обходной путь для этой проблемы Xarray?
3. Я получил нечто подобное при открытии набора данных opendap. Я исправил это, установив
cftime
которыйxarray
пытался импортировать в трассировке.
Ответ №1:
Спасибо за обновление в вашем комментарии. В вашем случае, поскольку ваши данные имеют регулярную частоту, я рекомендую обойти это, создав собственную временную координату с pandas.date_range
:
import pandas as pd
import xarray as xr
ds = xr.open_dataset("C:/Users/vsri/Downloads/prcp_monthly_1948-2008.nc", decode_times=False)
units, reference_date = ds.time.attrs['units'].split('since')
ds['time'] = pd.date_range(start=reference_date, periods=ds.sizes['time'], freq='MS')
Это создаст массив дат для первого числа каждого месяца, начиная с 1948-01-01 и заканчивая соответствующим количеством месяцев спустя.