gmtime и Masked Array - PullRequest
       35

gmtime и Masked Array

0 голосов
/ 03 апреля 2020

У меня есть массив с переменной времени:

time = masked_array(data=[5.89286318e+08, 5.89286330e+08, 5.89286342e+08, ...,
                   6.33450623e+08, 6.33450635e+08, 6.33450647e+08],
             mask=False,
       fill_value=1e+20)

Время - секунды с 1.1.2000. Итак, я попробовал это:

timestamp = datetime(2000, 1, 1, 0, 0, 0).strftime('%s')
timestamp = int(timestamp)
epoch_time = time.gmtime(time[0]+timestamp) 

Это приводит к ошибке AttributeError: «MaskedArray» не имеет атрибута «gmtime».

У кого-нибудь есть идеи, как решить эту проблему и преобразовать время в формате datetime?

1 Ответ

0 голосов
/ 03 апреля 2020

Вы можете использовать метод timestamp() из datetime класса модуля datetime. Чтобы это сделать, вам нужно перенести ваши временные метки в ту же эпоху, которую использует timestamp(), а именно 1970-01-01 (POSIX timestamp) . Для этого добавьте дельту в секундах между 1970-01-01 и 2000-01-01.

Пример:

from datetime import datetime
epoch = datetime(2000, 1, 1).timestamp()
t = 5.89286318e+08
dt = datetime.utcfromtimestamp(epoch + t)

# dt
# datetime.datetime(2018, 9, 3, 9, 38, 38)

Вы можете сделать то же самое, используя модуль time (хотя я бы предложил использовать datetime, так как это более удобно):

import time
epoch = time.mktime(time.strptime("2000-01-01", "%Y-%m-%d"))
t = 5.89286318e+08
ts = time.gmtime(epoch + t)

# ts
# time.struct_time(tm_year=2018, tm_mon=9, tm_mday=3, tm_hour=9, tm_min=38, tm_sec=38, tm_wday=0, tm_yday=246, tm_isdst=0)

Относительно части вопроса, которая касается Маскированные numpy массивы, например, вы можете извлечь все немаскированные значения массива следующим образом:

import numpy as np
ts = np.ma.masked_array(data=[5.89286318e+08, 5.89286330e+08, 5.89286342e+08,
                              6.33450623e+08, 6.33450635e+08, 6.33450647e+08],
                        mask=False,
                        fill_value=1e+20)

epoch = datetime(2000, 1, 1).timestamp()
ts_data_datetime = [datetime.utcfromtimestamp(epoch + t) for t in ts.data]
# ts_data_datetime 
# [datetime.datetime(2018, 9, 3, 9, 38, 38),
#  datetime.datetime(2018, 9, 3, 9, 38, 50),
#  datetime.datetime(2018, 9, 3, 9, 39, 2),
#  datetime.datetime(2020, 1, 27, 13, 30, 23),
#  datetime.datetime(2020, 1, 27, 13, 30, 35),
#  datetime.datetime(2020, 1, 27, 13, 30, 47)]
...