Преобразование массива секунд в минуты и секунды - PullRequest
2 голосов
/ 12 марта 2019

Вот хороший вопрос о переполнении стека о том, как перейти от секунд к часам, минутам и секундам: Как преобразовать секунды в часы, минуты и секунды?

Тем не менее, я не мог найти, как преобразовать массив значений секунд в минуты: секунды. У меня есть сюжет с тиками, равными секундам, поэтому я хочу конвертировать эти минуты и секунды.

Данные

# example data
tick_sec = np.array([-5., 0., 5., 10., 15., 20., 25., 30., 35., 40., 55., 60., 65., 70.])
# origin of data: tick_sec = ax.get_xticks()

попытка timedelta

import datetime

datetime.timedelta(seconds=tick_sec)

Дает:

TypeError                                 Traceback (most recent call last)
<ipython-input-29-cc4fdae20757> in <module>
      1 import datetime
      2 
----> 3 datetime.timedelta(seconds=tick_sec)

TypeError: unsupported type for timedelta seconds component: numpy.ndarray

попытка divmod (работает)

def sec_to_minsec(sec_arr):
    tick_min, tick_sec = divmod(sec_arr, 60)  # returns 2 numpy.ndarray
    print(type(tick_min))

    tick_m_s = np.empty([tick_min.size], dtype=(np.str, 8))  # init empty string array
    for i, min_sec in enumerate(zip(tick_min, tick_sec)):  # loop over 2 arrays
        tick_m_s[i] = f"{int(min_sec[0]):02d}:{int(min_sec[1]):02d}"  # add 0 before min and sec

    return tick_m_s

sec_to_minsec(tick_sec)

Выход:

array(['-1:55', '00:00', '00:05', '00:10', '00:15', '00:20', '00:25',
       '00:30', '00:35', '00:40', '00:55', '01:00', '01:05', '01:10'],
      dtype='<U8')

Работает, но я чувствую, что это может быть более эффективным? Кроме того, это дает странный вывод для отрицательного времени (хотя это не касается моей текущей проблемы)

System

  • Python 3.6 в среде Jupyter Notebook

Вопрос

Есть ли лучший / эффективный / более короткий код для выполнения моей попытки divmod?

1 Ответ

0 голосов
/ 12 марта 2019

Не уверен, будет ли он более эффективным или нет, но вы можете сделать это с помощью timedelta. Помимо прочего, производительность сильно зависит от полного набора данных, поэтому вам следует запустить несколько тестов, чтобы определить, что действительно лучше в вашей ситуации.

Например:

from datetime import timedelta
import numpy as np

tick_sec = np.array([-5., 0., 5., 10., 15., 20., 25., 30., 35., 40., 55., 60., 65., 70.])

tick_hms = np.array([str(timedelta(seconds=s)) for s in tick_sec])
print(tick_hms)
# ['-1 day, 23:59:55' '0:00:00' '0:00:05' '0:00:10' '0:00:15' '0:00:20' '0:00:25' '0:00:30' '0:00:35' '0:00:40' '0:00:55' '0:01:00' '0:01:05' '0:01:10']
...