2016-04-29 4 views
1

Я пытаюсь написать UDF в python, который будет вызываться из скрипта свиньи. UDF должен принимать дату в виде строки в формате DD-MMM-YYYY и возвращать формат DD-MM-YYYY. Здесь МММ будет как январь, февраль .. DEC и возвратным ММ будет 01, 02 ... 12.String Slicing in python UDF

Ниже мой питон UDF

#!/usr/bin/python 

@outputSchema("newdate:chararray") 
def GetMonthMM(inputString): 
    print inputString 
    #monthstring = inputString[3:6] 
    sl = slice(3,6) 
    monthstring = inputString[sl] 
    monthdigit = "" 

    if (monthstring == "JAN"): 
     monthdigit = "01" 
    elif (monthstring == "FEB"): 
     monthdigit = "02" 
    elif(monthstring == "MAR"): 
     monthdigit = "03" 
    elif(monthstring == "APR"): 
     monthdigit = "04" 
    elif(monthstring == "MAY"): 
     monthdigit = "05" 
    elif (monthstring == "JUN"): 
     monthdigit = "06" 
    elif (monthstring == "JUL"): 
     monthdigit = "07" 
    elif (monthstring == "AUG"): 
     monthdigit = "08" 
    elif (monthstring == "SEP"): 
     monthdigit = "09" 
    elif (monthstring == "OCT"): 
     monthdigit = "10" 
    elif (monthstring == "NOV"): 
     monthdigit = "11" 
    elif (monthstring == "DEC"): 
     monthdigit = "12" 

    sl1 = slice(0,3) 
    sl2 = slice(6,11) 
    str1 = inputString[sl1] 
    str2 = inputString[sl2] 

    newdate = str1 + monthdigit + str2 
    return monthstring; 

Я сделал некоторые отладки и проблема, кажется, что после нарезки строки обрабатываются как массивы. Я получаю следующее сообщение об ошибке

TypeError: unsupported operand type(s) for +: 'array.array' and 'str' 

То же самое происходит даже тогда, когда строка сравнивается с другой строкой, как в случае (monthstring == «декабрь») :. Даже если в строке месяца указана величина DEC, условие никогда не удовлетворяет.

Неужели кто-то сталкивался с тем же вопросом раньше? Любые идеи, как это исправить.

+1

Сторона примечания: почему бы не использовать объект 'dict', содержащий пары' 'Jan": "01" 'вместо этого леса' elif'. Создание этого 'dict' может быть легко с помощью модуля' calendar'. – quapka

+0

Невозможно воспроизвести - ваш код отлично работает для меня на Python 2.7.10, после замены 'return monthstring' на' return newdate'. ** Кроме того, ** какая строка дает ошибку? Измените свой вопрос и отметьте «#####» или что-то рядом с линией ошибок. Благодаря! – cxw

+0

, похоже, работает под python 2.7 –

ответ

1

Я хотел бы написать эту функцию следующим образом:

#!/usr/bin/python 
@outputSchema("newdate:chararray") 
def GetMonthMM(inputString): 
    monthArray = {'JAN':'01','FEB':'02','MAR':'03','APR':'04','MAY':'05','JUN':'06','JUL':'07','AUG':'08','SEP':'09','OCT':'10','NOV':'11','DEC':'12'} 
    print inputString 
    #monthstring = inputString[3:6] 
    dateparts = string.join(inputString).split('-') #assuming the date is always separated by - 
    dateparts[1] = monthArray[dateparts[1]] 
    return dateparts.join('-'); 
+0

Код не работает в функции split с сообщением об ошибке: AttributeError: объект 'array.array' не имеет атрибута 'split' –

+0

Ожидаемый ввод должен быть строкой, а не массивом ... Если вход представляет собой массив. то эта строка должна быть изменена. –

+0

Я исправил код, чтобы считать, что ваш inputString является массивом. –

1

Недавно я использовал calendar модуль, может быть более полезным в различных случаях, но в любом случае.

import calendar 
m_dict = {} 
for i, month in enumerate(calendar.month_abbr[1:]): #for some reason month_abbr[0] = '', so ommit that 
    m_dict[month.lower()] = '{:02}'.format(i+1) 

def GetMonthMM(inputStr): 
    day, month, year = inputStr.split('-') 
    return '-'.join([day, m_dict[month.lower()], year]) 

print(GetMonthMM('01-JAN-2015')) 
# prints 01-01-2015