Python 调整DataFrame中的异常格式后,函数继续返回None

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

我有一个熊猫数据帧,正在运行这个函数来调整时间的格式。时间以独特的方式格式化,并带有一些垃圾值

我尝试了不同的return语句,分配了不同的值来理解它是如何工作的,并且浏览了所有文档,但仍然无法理解为什么这个函数总是不返回任何值

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的索引器,并且它运行平稳。