Python 调整DataFrame中的异常格式后,函数继续返回None
我有一个熊猫数据帧,正在运行这个函数来调整时间的格式。时间以独特的方式格式化,并带有一些垃圾值 我尝试了不同的return语句,分配了不同的值来理解它是如何工作的,并且浏览了所有文档,但仍然无法理解为什么这个函数总是不返回任何值Python 调整DataFrame中的异常格式后,函数继续返回None,python,pandas,datetime,Python,Pandas,Datetime,我有一个熊猫数据帧,正在运行这个函数来调整时间的格式。时间以独特的方式格式化,并带有一些垃圾值 我尝试了不同的return语句,分配了不同的值来理解它是如何工作的,并且浏览了所有文档,但仍然无法理解为什么这个函数总是不返回任何值 df = pd.DataFrame({violation_time: ['+.98P','1037A', '0231P', '1206A', '0315P', '7824A']} def time_converter(times): """Converts
df = pd.DataFrame({violation_time: ['+.98P','1037A', '0231P', '1206A',
'0315P', '7824A']}
def time_converter(times):
"""Converts format of violation_time from HHMMP and HHMMA to datetime, assigns NaN"""
try:
for element in times:
if element[-1] == 'A':
hour = int(element[0:2])
minutes = int(element[2:4])
result = datetime.time(hour, minutes)
elif element[-1] =='P':
hour = int(element[0:2]) + 12
minutes = int(element[2:4])
result = datetime.time(hour, minutes)
else:
result = 'NaN'
return result
except ValueError:
'NaN'
df['time'] = df.violation_time.apply(time_converter)
我希望有一个新的系列,消除垃圾值,并将时间格式化为:
[10:37,02:31, 00:26, 15:15]
我可以通过在列表中添加“与熊猫有何不同?”来获得熊猫以外的这些值。您应该尝试:
df=pd.DataFrame({违反时间:['+.98P','1037A','0231P','1206A',',
'0315P'、'7824A']})
def时间_转换器(时间):
“”“将冲突时间的格式从HHMMP和HHMMA转换为datetime,分配NaN”“”
尝试:
如果时间[-1]=“A”:
小时=整数(时间[0:2])
分钟=整数(时间[2:4])
结果=日期时间。时间(小时,分钟)
elif时间[-1]=='P':
小时=int(时间[0:2])+12
分钟=整数(时间[2:4])
结果=日期时间。时间(小时,分钟)
其他:
结果='NaN'
返回结果
除值错误外:
“楠”
df['time']=df.invalization\u time.apply(时间转换器)
以下结果是否正确:
violation_time time
0 +.98P None
1 1037A 10:37:00
2 0231P 14:31:00
3 1206A 12:06:00
4 0315P 15:15:00
5 7824A None
import datetime as datetime
import pandas as pd
df = pd.DataFrame({'violation_time': ['+.98P','1037A', '0231P', '1206A', '0315P', '7824A']})
def time_converter(times):
"""Converts format of violation_time from HHMMP and HHMMA to datetime, assigns NaN"""
try:
element = times
if element[-1] == 'A':
hour = int(element[0:2])
minutes = int(element[2:4])
result = datetime.time(hour, minutes)
elif element[-1] =='P':
hour = int(element[0:2]) + 12
minutes = int(element[2:4])
result = datetime.time(hour, minutes)
else:
result = 'NaN'
return result
except ValueError:
'NaN'
df['time'] = df.violation_time.apply(lambda x: time_converter(x))
print (df)
我应用了lambda
作为df.invalization\u time.apply(lambda x:time\u converter(x))
。
而且,在时间转换器
功能中不需要for loop
请参阅以下完整代码:
violation_time time
0 +.98P None
1 1037A 10:37:00
2 0231P 14:31:00
3 1206A 12:06:00
4 0315P 15:15:00
5 7824A None
import datetime as datetime
import pandas as pd
df = pd.DataFrame({'violation_time': ['+.98P','1037A', '0231P', '1206A', '0315P', '7824A']})
def time_converter(times):
"""Converts format of violation_time from HHMMP and HHMMA to datetime, assigns NaN"""
try:
element = times
if element[-1] == 'A':
hour = int(element[0:2])
minutes = int(element[2:4])
result = datetime.time(hour, minutes)
elif element[-1] =='P':
hour = int(element[0:2]) + 12
minutes = int(element[2:4])
result = datetime.time(hour, minutes)
else:
result = 'NaN'
return result
except ValueError:
'NaN'
df['time'] = df.violation_time.apply(lambda x: time_converter(x))
print (df)
我猜try语句失败了。如果try失败并且触发了except,那么您的函数不会返回任何内容,这就是为什么您不会得到任何内容。如果在后面添加return语句,则可能会有所帮助。您可以将
return('NaN')
而不仅仅是'NaN',这是一个很好的例子,说明了为什么不应该在代码中放置一个覆盖性的try/except块。如果您在不使用的情况下运行它,则返回的ValueError
会引导您找到答案。当您应用它时,您的函数会在行上迭代。不需要循环。这里的元素实际上是日期的一个字符,而不是整个日期。今天我学到了一个重要的教训,我有时使用pythontutor.com来分析我的代码片段。这个程序不支持熊猫,所以我使用了列表。将函数返回到脚本时,我忽略了for循环。对那些返回语句也有一些见解。我不得不添加一个带有ValueError的索引器,并且它运行平稳。