Python 将Pandas.apply()方法与基于正则表达式的函数一起使用

Python 将Pandas.apply()方法与基于正则表达式的函数一起使用,python,regex,pandas,Python,Regex,Pandas,我试图在数据帧中创建一个新列,方法是对以数字为字符串的列应用函数 我已经编写了提取所需数字的函数,并在单个字符串输入上对其进行了测试,可以确认它是否有效 SEARCH_PATTERN=r'([0-9]{1,2})([0-9]{2}):([0-9]{2}):([0-9]{2}) def get_total_time_minutes(时间列,模式=搜索模式): “”“使用正则表达式将时间\u col(格式为'd hh:mm:ss'的字符串)解析为” 以分钟为单位获取总时间 """ 天,小时,分钟,u

我试图在数据帧中创建一个新列,方法是对以数字为字符串的列应用函数

我已经编写了提取所需数字的函数,并在单个字符串输入上对其进行了测试,可以确认它是否有效

SEARCH_PATTERN=r'([0-9]{1,2})([0-9]{2}):([0-9]{2}):([0-9]{2})
def get_total_time_minutes(时间列,模式=搜索模式):
“”“使用正则表达式将时间\u col(格式为'd hh:mm:ss'的字符串)解析为”
以分钟为单位获取总时间
"""
天,小时,分钟,u=re.match(模式,时间u col).groups()
总时间分钟=(整数(天)*24+整数(小时))*60+整数(分钟)
返回总时间分钟数
#测试该函数是否适用于单个输入
text=“2 23:24:46”
打印(获取总时间分钟数(文本))
输出:4284

#将函数应用于所需的列
df['Minutes Available']=df['Resource Available(d hh:mm:ss)”)。应用(获取总时间分钟)
下面的图片是我的dataframe列的屏幕截图。 我的数据帧的“可用资源(d hh:mm:ss)”列的类型为“o”(字符串,如果我的理解正确的话),数据格式如下:“5 08:00:00”。但是,当我调用apply(get_total_time_minutes)时,我得到以下错误:

TypeError:应为字符串或类似字节的对象


为了进一步澄清,“可用资源”列是一个字符串,表示资源可用的总时间(以天、小时、分钟和秒为单位)。我想将该时间字符串转换为以分钟为单位的总时间,因此在get_total_time_minutes函数中使用正则表达式和算术Sam Ezebunandu刚才说的

这可能有点不妥,因为它使用datetime库解析日期,然后通过减去默认历元将其转换为时间增量:

>>> pd.to_datetime('2 23:48:30', format='%d %H:%M:%S') - pd.to_datetime('0', format='%S')
Out[47]: Timedelta('1 days 23:48:30')

>>> Out[47] / pd.Timedelta('1 minute')
Out[50]: 2868.5

但它确实告诉你这两天过去了多少分钟,多少小时。它也是矢量化的,因此您可以将它应用到列中,并比使用
apply

更快地获取分钟值。您可以添加数据帧
df
的示例行吗?请尝试
.applymap()
而不是
。apply()
因为
获取总时间\u分钟()
设计用于对列的每个单元格进行操作;不是作为向量的列本身。它似乎对我有用:```>>>d=pd.DataFrame({“可用资源(dhh:mm:ss)”:[“2 23:24:46”,“3 23:12:45”]}>>d['Minutes available']=d['Resource available(dhh:mm:ss)]。应用(获取总时间(dhh:mm:ss)>>>d可用资源(dhh:mm:ss)分钟可用0 2 23:24:46 4284 1 3 23:12:45 5712``谢谢@AlexandreB。我已经添加了我的数据框的截图。嗨@JeremyHue。我已经添加了一个dataframe的屏幕截图。直到
Out
对象。如果你处理的是大数据,它也可能是一个真正的内存消耗。该列实际上是一个时间增量,单位为天小时:分钟:秒,而不是时间戳。如果你的列已经是
pd.Timedelta
,那么只需将该列除以
pd.Timedelta即可('1分钟')
。谢谢,@ifly6这很有效!我可以摆脱复杂的正则表达式,让事情变得简单。