Here is a good stack overflow question on how to go from seconds to hours, minutes and seconds: How do I convert seconds to hours, minutes and seconds?
However, I couldn't find how to convert a numpy array of seconds to minutes:seconds. I have a plot with it's ticks being seconds, so I want to convert that min and sec.
Data
# 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 attempt
import datetime
datetime.timedelta(seconds=tick_sec)
Gives:
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 attempt (working)
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)
Output:
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')
Works, but I feel this could be more efficient? Also, it gives a weird output for negative time (although that's not of concern for my current problem)
System
- Python 3.6 in a Jupyter Notebook environment
Question
Is there a better/efficient/shorter code way to do my divmod
attempt?
Not sure if it is more efficient or not, but you can get it done with
timedelta
. Performance is highly dependent on the complete dataset among other things, so you should run some tests to determine what is really best in your situation.For example: