当出生年份只有两个数字时,从个人数字计算年龄

Lou*_*sen 5 r date-of-birth

我知道有很多类似的问题.但我不是一样的问!

我的问题是,我所看到的所有问题都是全年的生日,fx 04/05/1971(格式:%d /%m /%Y).

我的数据中的生日是丹麦的CPR号码(个人识别码),它们看起来像这样:

   ID
1901912222
0110841111
0404143333
1602032444
Run Code Online (Sandbox Code Playgroud)

注意:这些日期就是例子.我有成千上万的行,它是所有年龄段的人,也超过100(但通常不超过17).

第1和第2个数字:出生日期第3个和第4个数字:出生月份第5个和第6个数字:出生年份最后4个=连续数字.

所以这给了我生日(和年龄):

   ID         birthdate      age
1901912222    19/09/91        26
0110841111    01/10/84        33
0404143333    04/04/14        103
1602024444    16/02/02        15
Run Code Online (Sandbox Code Playgroud)

所以格式为:%d%m%y [4位数的连续数]

所以最后四位数(序号)也有一些信息.他们告诉这个人是3岁还是103岁(现在我没有这一年).有关说明,请参见图片:

出生年份和序号

我不知道是否有任何帮助,但我有Excel代码:

= YEAR(NOW()) - 1-IF(DATE(YEAR(NOW()); MID(D12; 3; 2); LEFT(D12; 2))<= NOW(); MID(D12; 5; 2 )+ IF(左(右(D12; 4); 1)*1 <= 3; 1900; IF(AND(LEFT(RIGHT(D12; 4); 1)*1 = 4; MID(D12; 5; 2 )*1 <= 36); 2000; IF(AND(LEFT(RIGHT(D12; 4); 1)*1 = 4; MID(D12; 5; 2)*1> = 37); 1900; IF(AND (左(右(D12; 4); 1)*1> = 5;左(右(D12; 4); 1)*1 <= 8; MID(D12; 5; 2)*1 <= 57); 2000; IF(AND(LEFT(RIGHT(D12; 4); 1)*1> = 5;左(右(D12; 4); 1)*1 <= 8; MID(D12; 5; 2)*1 > = 58); 1800; IF(AND(LEFT(RIGHT(D12; 4); 1)*1 = 9; MID(D12; 5; 2)*1 <= 36); 2000 + MID(D12; 5; 2); 1900)))))) - 1; MID(D12; 5; 2)+ IF(左(右(D12; 4); 1)*1 <= 3; 1900; IF(AND(左(右(D12; 4); 1)*1 = 4; MID(D12; 5; 2)*1 <= 36); 2000; IF(AND(LEFT(RIGHT(D12; 4); 1)*1 = 4; MID(D12; 5; 2)*1> = 37); 1900; IF(AND(LEFT(RIGHT(D12; 4); 1)*1> = 5;左(右(D12; 4); 1)*1 <= 8; MID(D12; 5; 2)*1 <= 57); 2000; IF(AND(LEFT(RIGHT(D12; 4); 1)*1> = 5;左(右(D12; 4 ); 1)*1 <= 8; MID(D12; 5; 2)*1> = 58); 1800; IF(AND(LEFT(RIGHT(D12; 4); 1)*1 = 9; MID(D12 ; 5; 2)*1 <= 36); 2000 + MID(D12; 5; 2); 1900)))))))

我真的希望你能帮我解决这个问题!

Joh*_*man 4

困难的部分是从 ID 中提取实际出生日期。以下函数通过创建三个数组来查找“19”或“20”,具体取决于年份是 00-36、37-57 还是 58-99。它以标准格式返回日期"yyyy-mm-dd"

A <- c(rep("19",4),rep("20",6))
B <- c(rep("19",5),rep("20",4),"19")
C <- c(rep("19",5),rep("18",4),"19")
birthday <- function(code){
  day <- substr(code,1,2)
  month <- substr(code,3,4)
  year <- substr(code,5,6)
  snum <- 1+as.numeric(substr(code,7,7))
  prefix <- ifelse(as.numeric(year) <= 36,A[snum],ifelse(as.numeric(year)<=57,B[snum],C[snum]))
  year <- paste0(prefix,year)
  paste(year,month,day,sep = "-")
}
Run Code Online (Sandbox Code Playgroud)

例如:

df <- data.frame(ID = c("1901912222","0110841111","0404143333","1602024444"))
df$BD <- birthday(df$ID)
Run Code Online (Sandbox Code Playgroud)

产量:

          ID         BD
1 1901912222 1991-01-19
2 0110841111 1984-10-01
3 0404143333 1914-04-04
4 1602024444 2002-02-16
Run Code Online (Sandbox Code Playgroud)

一旦您获得了标准 4 位数年份格式的生日,就可以很容易地计算年龄等。看到这个问题。