如何使用正则表达式转换 Pandas 中的转换列

Posted

技术标签:

【中文标题】如何使用正则表达式转换 Pandas 中的转换列【英文标题】:How can I convert transform column in Pandas using regex 【发布时间】:2021-09-07 15:57:38 【问题描述】:

我有一个像这样的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

我试图使用regexeval 来评估时间(以秒为单位),但没有成功,实现这一目标的最佳方法是什么?

【问题讨论】:

【参考方案1】:

先用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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于如何使用正则表达式转换 Pandas 中的转换列的主要内容,如果未能解决你的问题,请参考以下文章

如何转换使用 Lookahead 的正则表达式模式?

如何编写一个正则表达式命令在 python 中将字符串转换为日期时间格式?

如何将 DFA 转换为正则表达式?

Swift 将 javascript 正则表达式转换为 ios 正则表达式

如何最好地使用正则表达式将层次文本文件转换为 XML?

使用正则表达式将python中的字符串中的布尔真转换为真[重复]