Применить функцию даты очистки данных к каждой строке в столбце - PullRequest
1 голос
/ 29 марта 2019

Я пытаюсь очистить «грязные» даты и преобразовать их в формат день-месяц-год через функцию.Я проверил свою функцию, и она дает правильные результаты.

def date_change(strDate):
    if ("-") in strDate:
        sp_Str_Dob= strDate.split("-")
    elif ("/") in strDate:
        sp_Str_Dob= strDate.split("/")

    if len(strDate)==4:
        return (strDate)
#day processing
    length_Day= len(sp_Str_Dob[0])
    if length_Day ==1:
        new_Day= str(("0" + sp_Str_Dob[0]))
    else:
        new_Day= str(sp_Str_Dob[0])
#month processing
    strMonth= (sp_Str_Dob[1])
    if (len(strMonth)) ==3:
        new_Month= str((strptime(strMonth,'%b').tm_mon)) #change letter month to number
    else:
        new_Month= str((strptime(strMonth,'%m').tm_mon)) #month is number
#year processing
    strYear= (sp_Str_Dob[2])
    length_Year= len(sp_Str_Dob[2])
    if length_Year ==2: #if only two digits then 20th cemtury
       new_Year= str("19" + sp_Str_Dob[2])
    else:
        new_Year= str(sp_Str_Dob[2]) 

    new_Date_Str= (new_Day + "/" + new_Month + "/" + new_Year)
    print(new_Date_Str)

В настоящее время, если ввод:

  • 30-сен-1895
  • 22-мар-76
  • 14/08/1966

Выход будет

  • 30/9/1895
  • 22/3 /1976
  • 14/8/1966

Я пытаюсь просмотреть столбец ['dob'] в моем подмножестве, который заменит старые значения на new_Date_Str

subset:

    dob
ID
1   30-Sep-1895
2   22-Mar-76
3   14/08/1966

Мне пришлось бы изменить функцию, чтобы она не вызывала аргументов, и пройти через каждое значение в ['dob'] в моей функции, однако я немного запутался, как проходить через каждую строку без использованияитэрроу / кортежи, как это не рекомендуется.

Является ли .loc лучшим способом сделать это?

Обновление: любой год, заканчивающийся двумя цифрами, должен быть преобразован в год 20-го века.

1 Ответ

3 голосов
/ 29 марта 2019

Pandas to_datetime может обрабатывать время даты в разных форматах, он будет возвращать даты в формате первого месяца.Вы можете использовать strftime, чтобы преобразовать их в первый день, но дата будет типом объекта, а не datetime.

df['dob'] = pd.to_datetime(df['dob']).dt.strftime('%d/%m/%Y')

    dob
ID  
1   30/09/1895
2   22/03/1976
3   14/08/1966
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...