我在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']])