将数据清除日期功能应用于列中的每一行

时间:2019-03-29 02:42:32

标签: python pandas bigdata

我正在尝试清除“混乱”日期,并通过函数将其转换为日-月-年格式。我已经测试了我的功能,它会产生正确的结果。

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)

当前输入是否为

  • 1895年9月30日
  • 76年3月22日
  • 1966年8月14日

输出应为

  • 30/9/1895
  • 1976年3月22日
  • 14/8/1966

我正在尝试遍历子集中的一列['dob'],该列会将旧值替换为new_Date_Str

subset:

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

我将不得不更改函数,以便它不调用任何参数并遍历函数中['dob']中的每个值,但是,我有点困惑如何在不使用iterrows /的情况下遍历每一行/不鼓励使用元组。

.loc是执行此操作的最佳方法吗?

更新: 任何以两位数结尾的年份都应转换为20世纪。

1 个答案:

答案 0 :(得分:3)

熊猫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