如何删除python中的日期格式子字符串?
我正在尝试清理一些数据,并想检查字符串中是否有日期格式。如果有日期格式,我想删除它 例如,我有如下输入: “午夜10-22-13高清” 我还想删除HD,检查末尾是否有日期,并将其与其他解析(如冒号后的条带字符)一起删除如何删除python中的日期格式子字符串?,python,date,pandas,substring,Python,Date,Pandas,Substring,我正在尝试清理一些数据,并想检查字符串中是否有日期格式。如果有日期格式,我想删除它 例如,我有如下输入: “午夜10-22-13高清” 我还想删除HD,检查末尾是否有日期,并将其与其他解析(如冒号后的条带字符)一起删除 def func(value): str(value) if ":" in value: return value.split(":", 1)[0] if value.endswith('HD'): return value
def func(value):
str(value)
if ":" in value:
return value.split(":", 1)[0]
if value.endswith('HD'):
return value[:-3]
else:
return value
我不想假设字符串是最后一个,而是假设它是6位数的非限定格式,然后返回带日期的值
我将这些函数应用于数据帧系列中的值
data["LongTitleAdjusted"] = data["Long Title"].apply(func)
以下是一些输入示例:
Stand-Up: "Weird Al" Yankovic
Stand-Up: "Weird Al" Yankovic HD
Doug Benson 3 HD
Midnight 11-14-13
Midnight 11-14-13 HD
Midnight 01-06-14
Midnight 01-06-14 HD
Midnight 01-07-14
预期产出:
Stand-Up
Stand-Up
Doug Benson 3
Midnight
Midnight
Midnight
Midnight
Midnight
解决方案
使用正则表达式匹配日期模式并替换它
import re
def func(x):
return re.sub(r'(.*)\d{2}[-/]\d{2}[-/]\d{2}(.*)', r'\1\2', x)
试试这个:
lines = [
'Stand-Up: "Weird Al" Yankovic',
'Stand-Up: "Weird Al" Yankovic HD',
'Doug Benson 3 HD',
'Midnight 11-14-13',
'Midnight 11-14-13 HD',
'Midnight 01-06-14',
'Midnight 01-06-14 HD',
'Midnight 01-07-14'
]
def clean_string(string):
clean = string
if ":" in string:
clean = string.split(":")[0]
else:
if string.endswith(" HD"):
string = string.replace(" HD", "")
clean = string.split(" ")
try:
datetime.strptime(clean[-1], '%m-%d-%y')
clean = string.replace(clean[-1], "")
except ValueError:
clean = string
return clean
它实际上尝试将日期字符串转换为日期;这意味着它不会剔除无效日期(毕竟,它们可能是值)。如果您不关心这个问题,您可以用一个查找所有数字的正则表达式、str的isdigit()方法或类似的方法来替换它
输出:
>>> for line in lines:
... print clean_string(line)
...
Stand-Up
Stand-Up
Doug Benson 3
Midnight
Midnight
Midnight
Midnight
Midnight
>>>
你能给我们举一个例子,里面有:
?另外,str(value)
完全不起作用,我想你的意思是value=str(value)
我试图找到各种不同的模式,然后删除它们。是的,我想在整个字符串中查找日期,然后返回不带日期的字符串。@KateLehman应该“午夜10-22-13 HD”返回“午夜”还是“午夜HD”?(piRSquared的regex解决方案目前返回“午夜HD”)。要做一个健壮的解决方案有很多事情需要考虑(所有的值都是空间分隔的吗?日期可以是字符串中的第一个元素吗?等等)。如果您发布了更多输入数据(正数和负数)和所需输出的示例,则会更容易。它应该会在午夜返回--如何在同一字符串上连续运行所有解析?是的,这是正确的。我得到了名称错误:全局名称“re”未定义。我尝试了:def func(value):str(value)return re.sub(r'(.*)d{2}[-/]\d{2}[-/]\d{2}(.*),r'\1\2',x)if:“in value:return value.split(“:”,1)[0]if value.endswith('HD'):return value[:-3]else:return value仍然有相同的名称error对不起,以前从未使用过rejex!这是genius谢谢@piRSquared