如何把这个时间数据改成H:M in python

How to change this time data into H:M in python

有一个包含持续时间列的数据集,其中时间数据列为如下所示的对象

df['duration'].head(10)
    0          60 min.
    1    1 hr. 13 min.
    2    1 hr. 10 min.
    3          52 min.
    4    1 hr. 25 min.
    5          45 min.
    6          45 min.
    7          60 min.
    8          45 min.
    9          45 min.
    Name: duration, dtype: object

如何将其更改为合适的数值,如下所示?

0    00:60
1    01:13
2    01:10
3    00:52
4    01:25
5    00:45

您可以像这样在 duration 列上应用 lambda 函数:

import pandas as pd
import datetime as dt

def transform(t):
    if 'hr.' in t:
        return dt.datetime.strptime(t, '%I hr. %M min.').strftime('%I:%M')
    return dt.datetime.strptime(t, '%M min.').strftime('00:%M')

df = pd.DataFrame(['45 min.', '1 hr. 13 min.'], columns=['duration'])
print(df)

df['duration'] = df['duration'].apply(lambda x: transform(x))
print(df)

输出:

        duration
0        45 min.
1  1 hr. 13 min.

然后

  duration
0    00:45
1    01:13

请注意,如果您想要“60 分钟”。映射到“00:60”,那么您需要在 transform 函数中添加一些额外的逻辑,因为分钟格式 %M 仅采用 00-59 之间的值。

这是一种获取 %H:%M 格式的字符串版本和时间增量版本的方法:

import pandas as pd
df = pd.DataFrame({'duration':['60 min.', '1 hr. 13 min.', '1 hr. 10 min.']})
print(df)

df['parts']=df.duration.str.findall('\d+')
df['timedelta']=df.parts.apply(lambda x: pd.to_timedelta((0 if len(x) < 2 else int(x[0])) * 3600 + int(x[-1])*60, unit='s'))
df['hours and minutes']=df.parts.apply(lambda x: f"{0 if len(x) < 2 else int(x[0]):02}:{int(x[-1]):02}")
df = df.drop(columns=['duration', 'parts'])
print(df)

输入:

        duration
0        60 min.
1  1 hr. 13 min.
2  1 hr. 10 min.

输出:

        timedelta hours and minutes
0 0 days 01:00:00             00:60
1 0 days 01:13:00             01:13
2 0 days 01:10:00             01:10

如果我们这样做:

print(df.timedelta.dtypes)

...我们看到 timedelta 列确实包含数值(timedelta 数据类型):

timedelta64[ns]