Как взять объект datetime.time в UT и преобразовать в местное время с учетом долготы

Мне нужно преобразовать время в UT в сочетании с долготой в местное время. Я работаю над анализом будущей спутниковой миссии по наблюдению за Землей, и мне нужно сделать это преобразование, чтобы продолжить.

Я нашел общее решение этой проблемы здесь: T( lt) = T(ut) + lon/(360/24), однако его реализация сводит меня с ума.

Мои данные являются объектами даты и времени:

In[9]: sattime[0] 
Out[9]: datetime.time(18, 0)

и координаты долготы от 0 до 360 градусов.

Мне нужно взять этот объект и использовать приведенное выше уравнение для преобразования в местное время. Я ТОЛЬКО забочусь о времени относительно полуночи, а НЕ о дате (на самом деле остальная часть моего кода в настоящее время использует только объект datetime.time, и предпочтительно, чтобы вывод локального времени был тем же типом объекта).

Я пробовал следующее из здесь, но я застрял, возвращая локальную переменную обратно в объект времени.

test = 4       
for (i,j) in zip(sattime, satloncor):
    td = datetime.datetime.combine(datetime.datetime.min, i) - datetime.datetime.min
    seconds = td  // datetime.timedelta(milliseconds=1)
    local = (seconds + (j/(360/86400)))/1000
    print (local)
    if test<0:
        break
    test-=1

Тестовая часть кода просто гарантирует, что я не трачу время на преобразование всех ~ 400 000 точек данных.

Подводя итог, я хочу взять объект datetime.time в UT в сочетании с соответствующей долготой и преобразовать его в местное солнечное время как объект datetime.time.

Все это кажется очень запутанным и кажется, что должен быть более простой способ. Любая помощь приветствуется! Спасибо!


person Will.Evo    schedule 06.07.2017    source источник


Ответы (2)


Я понял это, но это не красиво.

localtimes = []
for (i,j) in zip(sattime, satloncor):
    td = dt.datetime.combine(dt.datetime.min, i) - dt.datetime.min
    seconds = td  // dt.timedelta(seconds=1)
    local = (seconds + (j/(360/86400)))/3600
    if local>24:
        local-=24
    strip = [math.modf(local)[1],math.modf(local)[0]*60 ]
    if strip[0]==24:
        localtimes.append(dt.time(0, int(strip[1]),0))
    else:
        localtimes.append(dt.time(int(strip[0]), int(strip[1]),0))
person Will.Evo    schedule 12.07.2017

Извините, но это очень запутанно, потому что это сложная тема. Например, знаете ли вы, что каждые несколько лет бывает день, в котором 86401 секунда?

Пара хороших сайтов для начала:

http://www.ephemeris.com/books.html

Могу порекомендовать книгу "Практическая астрономия с помощью калькулятора".

https://www.timeanddate.com/

Надеюсь это поможет.

person Hugh Fisher    schedule 07.07.2017