如何使用正则表达式转换 Pandas 中的转换列
How can I convert transform column in Pandas using regex
我有一个 time column
这样的:
df = pd.DataFrame({'time': {0: '1 h 50 min', 1: '50 min', 2: '2 h 3 min', 3: '3 min'}})
time
0 1 h 50 min
1 50 min
2 2 h 3 min
3 3 min
我想在几秒钟内获得信息,例如:
time
6600
3000
7380
180
我尝试使用 regex
和 eval
来评估时间(以秒为单位)但没有成功实现此目标的最佳方法是什么?
先用regex
得到小时和分钟,然后把两者都换算成分钟求和,最后乘以60得到秒。
df['time'].str.findall('(\d+)\s*(h|min)').apply(lambda x: sum(int(t)*60 if u=='h' else int(t) for t,u in x))*60
输出:
0 6600
1 3000
2 7380
3 180
Name: time, dtype: int64
如果需要,您可以只使用单独的小时和分钟列:
out = df.assign(hours=df['time'].str.extract('(\d+)\s*h'),
minutes=df['time'].str.extract('(\d+)\s*min')).fillna(0)
time hours minutes
0 1 h 50 min 1 50
1 50 min 0 50
2 2 h 3 min 2 3
3 3 min 0 3
现在,您可以将它们转换为整数并获得秒数:
out['hours'].astype(int)*3600+out['minutes'].astype(int)*60
0 6600
1 3000
2 7380
3 180
dtype: int32
pd.TimedeltaIndex
理解许多字符串形式的持续时间,因此您可以将您的列直接传递给它。它也有 total_seconds
方法,所以:
>>> df["seconds"] = pd.TimedeltaIndex(df.time).total_seconds()
>>> df
time seconds
0 1 h 50 min 6600.0
1 50 min 3000.0
2 2 h 3 min 7380.0
3 3 min 180.0
我有一个 time column
这样的:
df = pd.DataFrame({'time': {0: '1 h 50 min', 1: '50 min', 2: '2 h 3 min', 3: '3 min'}})
time
0 1 h 50 min
1 50 min
2 2 h 3 min
3 3 min
我想在几秒钟内获得信息,例如:
time
6600
3000
7380
180
我尝试使用 regex
和 eval
来评估时间(以秒为单位)但没有成功实现此目标的最佳方法是什么?
先用regex
得到小时和分钟,然后把两者都换算成分钟求和,最后乘以60得到秒。
df['time'].str.findall('(\d+)\s*(h|min)').apply(lambda x: sum(int(t)*60 if u=='h' else int(t) for t,u in x))*60
输出:
0 6600
1 3000
2 7380
3 180
Name: time, dtype: int64
如果需要,您可以只使用单独的小时和分钟列:
out = df.assign(hours=df['time'].str.extract('(\d+)\s*h'),
minutes=df['time'].str.extract('(\d+)\s*min')).fillna(0)
time hours minutes
0 1 h 50 min 1 50
1 50 min 0 50
2 2 h 3 min 2 3
3 3 min 0 3
现在,您可以将它们转换为整数并获得秒数:
out['hours'].astype(int)*3600+out['minutes'].astype(int)*60
0 6600
1 3000
2 7380
3 180
dtype: int32
pd.TimedeltaIndex
理解许多字符串形式的持续时间,因此您可以将您的列直接传递给它。它也有 total_seconds
方法,所以:
>>> df["seconds"] = pd.TimedeltaIndex(df.time).total_seconds()
>>> df
time seconds
0 1 h 50 min 6600.0
1 50 min 3000.0
2 2 h 3 min 7380.0
3 3 min 180.0