我在数据框df中有一列:
Time
2 hours 3 mins
5 hours 10 mins
1 hour 40 mins
我想在df'Minutes'中创建一个新列,将该列转换为分钟
Minutes
123
310
100
是否有python函数可以做到这一点?
答案 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.findall
与numpy
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))
希望它有用;)