关于我的代码为何停止工作的建议?

时间:2020-04-21 09:04:17

标签: python pandas

我编写了一些代码来检查数据帧(一次一行)的三列(Crash_Month,Crash_Day和Crash_Time)的值,然后根据每个单元格的值将相应的值打印为由代码定义。但是,我回到了代码中,所有的if / elif语句似乎都没有起作用,并且我的代码现在打印出未转换的值,而不是这些值的对应值。我怎样才能解决这个问题?有什么问题感谢您的帮助,我将在下面插入代码

#Compute day year function
import pandas as pd
import datetime

data = pd.read_csv('road_accidents_data_clean.csv',delimiter=',')
df = pd.DataFrame(data)

#----------------------------------------------
#n is the row which you wish to convert
n = 0
#----------------------------------------------

ctime = datetime.datetime.strptime(c,'%H:%M:%S').time()

Season = data.loc[n,'Crash_Month']
DayWeek = data.loc[n,'Crash_Day']
TPDay = data.loc[n,'Crash_Time']

def compute_day_year(Season,DayWeek,TPDay):

    Season = data.loc[n,'Crash_Month']
    for (i, item) in enumerate(Season):
        if item >= 1 <= 2:
             Season[i] = 'Summer'

        elif item >= 3 <= 6:
             Season[i] = 'Autumn'

        elif item >= 6 <= 9:
             Season[i] = 'Winter'

        elif item >= 9 <= 11:
             Season[i] = 'Spring'

        elif item == 12:
             Season[i] = 'Summer'  

        if not item in range(1, 12):
                Season[i] = 'INVALID'
                DayWeek[i] = 'INVALID'
                TPDay[i] = 'INVALID'

    DayWeek = data.loc[n,'Crash_Day']
    for (i, item) in enumerate(DayWeek):
        if item == 1:
             DayWeek[i] = 'Monday'

        elif item == 2:
             DayWeek[i] = 'Tuesday'

        elif item == 3:
             DayWeek[i] = 'Wednesday'

        elif item == 4:
             DayWeek[i] = 'Thursday' 

        elif item == 5:
             DayWeek[i] = 'Friday'  

        elif item == 6:
             DayWeek[i] = 'Saturday'

        elif item == 7:
             DayWeek[i] = 'Sunday' 

        if not item in range(1, 7):
                Season[i] = 'INVALID'
                DayWeek[i] = 'INVALID'
                TPDay[i] = 'INVALID'

    TPDay = data.loc[n,'Crash_Time']
    for (i, item) in enumerate(TPDay):
        if datetime.time(6,0,0) <= ctime <= datetime.time(11,59,0):
                 TPDay[i] = 'Morning'

        elif datetime.time(12,0,0) <= ctime <= datetime.time(17,59,0):
                 TPDay[i] = 'Afternoon'

        elif datetime.time(18,0,0) <= ctime <= datetime.time(23,59,0):
                 TPDay[i] = 'Evening'

        elif datetime.time(0,0,0) <= ctime <= datetime.time(5,59,0):
                TPDay[i] = 'Night'


print(Season, DayWeek, TPDay)

2 个答案:

答案 0 :(得分:1)

对于初学者来说,所有这些条件都是错误的:

if item >= 1 <= 2:

以上等同于item >= 1 and 1 <= 2,即item >= 1。我相信您真的要写:

if 1 <= item <= 2:

...转换为item >= 1 and item <= 2,而是您要表达的意思。

答案 1 :(得分:0)

有3个问题:

  1. Óscar指出的关于if的第一件事
  2. 该函数不返回任何内容
  3. 该函数未在任何地方调用

3,来自评论:

调用该函数(键入compute_day_year)会产生以下结果:我需要怎么做才能使其返回已转换的值?

调用=用参数添加括号。 ;)

2:有两个选项:

  • 在函数的末尾添加return Season, Dayweek, TPDay(注意缩进-它应该在函数中,但不要在函数的末尾,因此只有一个制表符/一组,每组4个空格);调用函数时,保存结果
  • 或删除参数列表(def compute_day_year(Season,DayWeek,TPDay)-> def compute_day_year())并将global Season, DayWeek, TPDay添加为函数的第一行。

一般来说,第一个选项更可取,但似乎您想做第二个-您认为您正在处理完全相同的对象。

但是:无论如何,您永远不会使用这些参数的原始值,而是始终将其覆盖。因此,真正的解决方法是:删除函数上方的变量声明,删除参数列表,返回结果

1:Óscar已经解释了。

#Compute day year function
import pandas as pd
import datetime

data = pd.read_csv('road_accidents_data_clean.csv',delimiter=',')
df = pd.DataFrame(data)

#----------------------------------------------
#n is the row which you wish to convert
n = 0
#----------------------------------------------

ctime = datetime.datetime.strptime(c,'%H:%M:%S').time()

#no declaration here

def compute_day_year(): # no parameter list here - you only use data object to get the desired values

    Season = data.loc[n,'Crash_Month']
    for (i, item) in enumerate(Season):
        if 1 <= item <= 2:  #fix 1
             Season[i] = 'Summer'

        elif 3 <= item <= 6:
             Season[i] = 'Autumn'

        elif 6 <= item <= 9:
             Season[i] = 'Winter'

        elif 9 <= item <= 11:
             Season[i] = 'Spring'

        elif item == 12:
             Season[i] = 'Summer'  

        if not item in range(1, 12):
                Season[i] = 'INVALID'
                DayWeek[i] = 'INVALID'
                TPDay[i] = 'INVALID'

    DayWeek = data.loc[n,'Crash_Day']
    for (i, item) in enumerate(DayWeek):
        if item == 1:
             DayWeek[i] = 'Monday'

        elif item == 2:
             DayWeek[i] = 'Tuesday'

        elif item == 3:
             DayWeek[i] = 'Wednesday'

        elif item == 4:
             DayWeek[i] = 'Thursday' 

        elif item == 5:
             DayWeek[i] = 'Friday'  

        elif item == 6:
             DayWeek[i] = 'Saturday'

        elif item == 7:
             DayWeek[i] = 'Sunday' 

        if not item in range(1, 7):
                Season[i] = 'INVALID'
                DayWeek[i] = 'INVALID'
                TPDay[i] = 'INVALID'

    TPDay = data.loc[n,'Crash_Time']
    for (i, item) in enumerate(TPDay):
        if datetime.time(6,0,0) <= ctime <= datetime.time(11,59,0):
                 TPDay[i] = 'Morning'

        elif datetime.time(12,0,0) <= ctime <= datetime.time(17,59,0):
                 TPDay[i] = 'Afternoon'

        elif datetime.time(18,0,0) <= ctime <= datetime.time(23,59,0):
                 TPDay[i] = 'Evening'

        elif datetime.time(0,0,0) <= ctime <= datetime.time(5,59,0):
                TPDay[i] = 'Night'
    return Season, DayWeek, TPDay

Season, DayWeek, TPDay = compute_day_year() 
print(Season, DayWeek, TPDay)