简体   繁体   中英

Time format for sport data (performance/chrono measures)

I want to represent some data I have in the following format: 120 hours, 24 minutes, 45 seconds. I spent some time looking for the appropriate formating function to use in Python or Pandas, but could not find any corresponding properly to the one I need.

The data I have looks like this:

197hr 54min 0sec

200hr 28min 49sec

147hr 13min 58sec

datetime.time could work, but I'm limited in range [0, 23] for hours count.

I could go with my own formating style, but I would prefer to have a "standard format" that I can work with (calculating offsets, translate it in other formats, etc.).

You can create column filled by timedeltas :

df['td'] = pd.to_timedelta(df["data"])
print (df)
                data              td
0   197hr 54min 0sec 8 days 05:54:00
1  200hr 28min 49sec 8 days 08:28:49
2   231hr 7min 15sec 9 days 15:07:15
3  228hr 36min 13sec 9 days 12:36:13
4   221hr 36min 0sec 9 days 05:36:00
5    222hr 8min 6sec 9 days 06:08:06

You want to use Timedelta objects. datetime has one too, but I prefer pandas

import pandas as pd
td = pd.Timedelta('200hr 28min 49sec')

You can add, subtract and divide timedeltas. To do more calculations you might want to work with td.total_seconds() .

But printing the timedelta gives you a different format:

>>> td
Timedelta('8 days 08:28:49')

Solution: Write your own format function

def timedelta_to_str(td):
    h = td // pd.Timedelta('1h')
    td -= pd.Timedelta(hours = h)
    m = td // pd.Timedelta('1m')
    td -= pd.Timedelta(minutes = m)
    s = td.seconds
    return f'{h}hr {m}min {s}sec'
>>> timedelta_to_str(td)
200hr 28min 49sec

To use this format within a DataFrame you might want to use this hack:

pd.Timedelta.__repr__ = timedelta_to_str

This changes the default representation of all Timedelta Objects!

Or you might want to use inheritance to make it super clean:

class myTimedelta(pd.Timedelta):
    def __repr__(self):
        td = pd.Timedelta(self) # make a copy
        h = td // pd.Timedelta('1h')
        td -= pd.Timedelta(hours = h)
        m = td // pd.Timedelta('1m')
        td -= pd.Timedelta(minutes = m)
        s = td.seconds
        return f'{h}hr {m}min {s}sec'
>>> myTimedelta('200hr 28min 49sec')
200hr 28min 49sec
>>> myTimedelta('200hr 28min 49sec') + myTimedelta('1hr')
201hr 28min 49sec

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM