如何在python中将小时和分钟的字符串转换为分钟?

时间:2019-06-28 15:16:59

标签: python pandas

我在数据框df中有一列:

Time
2 hours 3 mins
5 hours 10 mins
1 hour 40 mins

我想在df'Minutes'中创建一个新列,将该列转换为分钟

Minutes
123
310
100

是否有python函数可以做到这一点?

7 个答案:

答案 0 :(得分:11)

您需要通过to_datetime

进行转换
s=pd.to_datetime(df.Time.replace({'hours':'hour'},regex=True),format='%H hour %M mins')
s.dt.hour*60+s.dt.minute
Out[406]: 
0    123
1    310
2    100
Name: Time, dtype: int64

或者我们将str.findallnumpy dot

一起使用
np.dot(np.array(df.Time.str.findall('\d+').tolist()).astype(int),[60,1])
Out[420]: array([123, 310, 100])

答案 1 :(得分:9)

pd.eval

df['Minutes'] = pd.eval(
    df['Time'].replace(['hours?', 'mins'], ['*60+', ''], regex=True))
df
              Time Minutes
0   2 hours 3 mins     123
1  5 hours 10 mins     310
2   1 hour 40 mins     100

想法是让replace将其转换为数学表达式,然后让熊猫对其进行评估:

expr = df['Time'].replace(['hours?', 'mins'], ['* 60 +', ''], regex=True)
expr

0    2 * 60 +  3 
1    5 * 60 + 10 
2    1 * 60 + 40 
Name: Time, dtype: object

pd.eval(expr)
# array([123, 310, 100], dtype=object)

str.extract和乘法

((df['Time'].str.extract(r'(\d+) hour.*?(\d+) min').astype(int) * [60, 1])
            .sum(axis=1))

0    123
1    310
2    100
dtype: int64

编写一个简单的正则表达式以提取数字,然后使用简单的算术将其转换为分钟。您可以将模式缩短为

(df['Time'].str.extract(r'(\d+)\D*(\d+)').astype(int) * [60, 1]).sum(axis=1)

0    123
1    310
2    100
dtype: int64

按照@Quang Hoang的建议。

答案 2 :(得分:1)

“是否有python函数可以做到这一点?” 直到你写一个...

def to_minutes(time_string):
    hours, _, minutes, _ = time_string.split(' ')
    return int(hours) * 60 + int(minutes)

结果应类似于:

>>> to_minutes('2 hours 3 mins')
123

答案 3 :(得分:1)

我相信您可以转换为timedelta并转换为timedelta64[m]

pd.to_timedelta(df.Time.str.replace('mins', 'm'), unit='m').astype('timedelta64[m]')

Out[786]:
0    123.0
1    310.0
2    100.0
Name: Time, dtype: float64

答案 4 :(得分:0)

如果您喜欢lambda函数,也可以使用:

df.Time.apply(lambda x: sum(np.array([ int(i) for i in re.match(r'(\d+) hour[s]? (\d+) min[s]?', x).groups()]) * [60, 1]))

答案 5 :(得分:0)

假设“时间”列的格式始终与您可以使用的格式相同(空格数相同)-

def Mins(row):
    return int(row['Time'].split(' ')[0])*60 + int(row['Time'].split(' ')[2])

df.apply(Mins,axis=1)

答案 6 :(得分:0)

我认为没有内置函数,但是您可以构建一个内置函数,然后通过.apply()在熊猫中使用它。

这可能不是最短的答案,但是它将使您了解如何在Pandas中使用基本的Python函数。我认为这非常有帮助!

我构建的功能:

import re

def calculate_number_of_minutes(hours_string):
    regex = '\d+( )\w+'
    // I build a regex which can find a sequence of digits and a single word


    result = re.finditer(regex, text, re.DOTALL)
    // I find such patterns in the given string

    minutes = 0
    for element in result:
        fragment = element.group()

        if 'hour' in fragment:
            minutes += int(re.search('\d+', fragment).group()) * 60
            // if there are 'hours', the associated number is multiplied by 60
            // and added to the count
        else:
            minutes += int(re.search('\d+', fragment).group())

    return minutes


text = '5 hours 10 mins'
print(calculate_number_of_minutes(text))

它的作用是在字符串中搜索数字,然后计算分钟数。

为了将其应用于您的列,请尝试以下操作:

data.loc[;, 'Time'] = data['Time'].apply(lambda x: calculate_number_of_minutes(x))

希望它有用;)