Python - изменить UT C на местное время в файле netCDF - PullRequest
0 голосов
/ 27 января 2020

Я работаю с почасовыми данными ERA5 из ECMWF, которые содержат климатические переменные c.

Общий аспект файла:

'era5-hourly-2m_tempera_firstfourdays- january_2017.n c '

Dimensions:    (latitude: 184, longitude: 129, time: 96)
Coordinates:
  * longitude  (longitude) float32 -81.4 -81.3 -81.2 -81.1 ... -68.8 -68.7 -68.6
  * latitude   (latitude) float32 -0.1 -0.2 -0.3 -0.4 ... -18.2 -18.3 -18.4
  * time       (time) datetime64[ns] 2017-01-01 ... 2017-01-04T23:00:00
Data variables:
    t2m        (time, latitude, longitude) float32 ...
Attributes:
    Conventions:  CF-1.6
    history:      2020-01-09 19:38:29 GMT by grib_to_netcdf-2.15.0: /opt/ecmw...

Это матрица информации, которая содержит много переменных и наблюдений.

Перед любым предыдущим анализом Я хочу преобразовать UT C время по местному времени (UT C -5) с использованием Python. Я погуглил и просмотрел много страниц и форумов, но не нашел ничего, что отвечало бы на мой вопрос. Я понял наличие команд в ряде постов:

datetime , pytz , tzinfo , astimezone,

и другие, но ни один из примеров не рассматривал файл netCDF.

Заранее спасибо.

1 Ответ

1 голос
/ 01 февраля 2020

Прежде всего, я бы посоветовал сэкономить массу хлопот и поработать в UT C, когда это возможно.

Если вам действительно нужно местное время, datetime и pytz - ваш путь к go. Кстати, преобразование не имеет ничего общего с netcdf, но помните, что модуль netCDF4 предлагает полезные функции num2date и date2num [docs] .

from datetime import datetime
import pytz

string = '2017-01-04T23:00:00'
dt_obj = datetime.strptime(string, '%Y-%m-%dT%H:%M:%S')

# note that dt_obj is naive, i.e. it has no timezone info, so let's add it:
dt_obj = dt_obj.replace(tzinfo=pytz.utc)
print(datetime.strftime(dt_obj, '%Y-%m-%dT%H:%M:%S %Z %z'))
# 2017-01-04T23:00:00 UTC +0000

# now let's shift time to another timezone:
new_timezone = pytz.timezone('US/Eastern')
dt_obj = dt_obj.astimezone(new_timezone)
print(datetime.strftime(dt_obj, '%Y-%m-%dT%H:%M:%S %Z %z'))
# 2017-01-04T18:00:00 EST -0500
...