如何根据Python Pandas中的重要情况将数字转换为出生日期?



我在Python Pandas中有如下数据框架:

number
----------
54062903812
96120309725
00021201044
00346

我需要创建新的列,我需要从列"number"转换每个值的前6个元素生日日期:例如:

  • 值1和2表示出生年份

  • 出生3和4个月

  • 出生第5天和第6天

    • 54062903812 = 1954-06-29
    • 96120309725 = 1996-12-03
    • 00021201044 = 2000-02-12

目前我使用下面的函数来做到这一点,但是这个函数有一个巨大的问题,因为它返回54062903812是2054-06-29,但它当然应该是1954-06-29,当然这是不可能的。我的代码:

df["birthday"] = pd.to_datetime(df["number"].str[:6], format='%y%m%d', errors='coerce')

我如何修改我的代码,以便能够识别:

  • 如果从<0开始,则为1900
  • 如果从>=0开始,则为2000

**请注意,我只需要从列"number"它有11个元素!!

If您可以从您的数据中假设任何00到21都是2000到2021,您可以尝试下面的代码。这是一个想法。

import pandas as pd
df = pd.DataFrame({'Col1': {0: 54062903812, 1: 96120309725, 2: 21201044}})
def addYear(x):
years = ['00' , '01' , '02' , '03' , '04' , '05' , '06' , '07' , '08' , '09' , '10' , '11' , '12' , '13' , '14' , '15' , '16' , '17' , '18' , '19' , '20' , '21' , '22']
x = str(x)
if x[:2] in years:
x = '20' + x
else:
x = '19' + x
x = pd.to_datetime(x[:7], format='%Y%m%d')
return x
df['Date1'] = df.apply(lambda x: addYear(x['number']), axis=1)
print(df)

number         Date1
0  54062903812  1954-06-02
1  96120309725  1996-01-20
2  21201044     2021-02-01

更新:

如果len(x) <11:

import pandas as pd
df = pd.DataFrame({'Col1': {0: 54062903812, 1: 96120309725, 2: 21201044, 3: 1234}})
def addYear(x):
years = ['00' , '01' , '02' , '03' , '04' , '05' , '06' , '07' , '08' , '09' , '10' , '11' , '12' , '13' , '14' , '15' , '16' , '17' , '18' , '19' , '20' , '21' , '22']
x = str(x)
if len(x) < 11:
return 0
else:
if x[:2] in years:
x = '20' + x
else:
x = '19' + x
x = pd.to_datetime(x[:7], format='%Y%m%d')
return x
df['Date1'] = df.apply(lambda x: addYear(x['Col1']), axis=1)
print(df)

Col1                Date1
0  54062903812  1954-06-02 00:00:00
1  96120309725  1996-01-20 00:00:00
2     21201044                    0
3         1234                    0
df["birthday"] = pd.to_datetime(df.number.str[:6],format="%y%m%d", errors="coerce")   
df["birthday"] = df.birthday.apply(lambda x:x.replace(year=x.year-100) if x.year>2000 else x)
df['birthday'] = pd.Series([f"19{y[:2]}-{y[2:4]}-{y[4:6]}" if int(y[:2]) > 21 else f"20{y[:2]}-{y[2:4]}-{y[4:6]}" if len(y) == 11 else "0" for y in df['number']])

相关内容

  • 没有找到相关文章

最新更新