2017-12-29 10 views
5

これに似た質問がたくさんあります。しかし、私は同じことを求めていない!出生年に2つの数字しかない場合は、個人番号から年齢を計算してください

私の見てきた問題はすべて、年間を通して、fx 04/05/1971(形式:%d /%m /%Y)の誕生日です。私のデータで

誕生日にはデンマークのCPR-番号(個人識別番号)であり、彼らは次のようになります。

ID 
1901912222 
0110841111 
0404143333 
1602032444 

NB:これらの日付は例です。私には何千もの行があり、すべての年齢層の人々で、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 

だからフォーマットは:%d個の%mの%をY [4桁の連番]

だから最後の4桁(連続番号)にもいくつかの情報があります。彼らは、その人が3歳か103歳の年齢であるかどうかを確認します(私には今年はありません)。 1-IF(DATE -

= YEAR(NOW()):

Birth year and sequential number

それは任意のヘルプだ場合、私は知らないが、私は、Excelのコードを持っている: 説明については画像を参照してください。 (D12; 5; 2)+ IF(LEFT(RIGHT(D12; 4); NOW(NOW)); MID(D12; 3; 2); LEFT(D12; 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; LEFT(RIGHT(D12; 4); 1)* 1 < = 8; MID(D12; 5; 2)* 1 < = 57); 2000; IF ); 1)* 1> = 5; LEFT(R IGHT(D12; 4); 1)* 1 < = 8; MID(D12; 5; 2)* 1> = 58); 1800; IF(AND LEFT(RIGHT(D12; 4); 1)* 1 = MID(D12; 5; 2)+ IF(LEFT(9); MID(D12; 5; 2)* 1) (右(D12; 4); 1)* 1 = 4; MID(D12; 5; 2)* 1 < = 1)= 37); 1900; IF(AND(LEFT(RIGHT(0,0))); AND(LEFT(RIGHT(D12; 4); 1) 1)= 5; LEFT(RIGHT(D12; 4); 1)* 1 < = 8; MID(D12; 5; 2)* 1 < = 57); 2000; IF(AND (LEFT(RIGHT(D12; 4); 1)* 1 = 5; LEFT(RIGHT(D12; 4); 1)* 1 < = 8; MID(D12; 5; 2)* 1> = 58)。 2000 + MID(D12; 5; 2); 1900); IF(AND(LEFT(RIGHT(D12; 4); 1)* 1 = 9; MID(D12; 5; 2)* 1 < = ))))))))))

私は本当にあなたがこの問題で私を助けることができます願っています!

答えて

4

難しい部分はidから実際の生年月日を抽出しています。次の関数は、年が00-36,37-57、または58-99のいずれかであるかどうかに応じて、 "19"または "20"のいずれかを検索する3つの配列を作成することによって行います。例えば

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 = "-") 
} 

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

降伏:

  ID   BD 
1 1901912222 1991-01-19 
2 0110841111 1984-10-01 
3 0404143333 1914-04-04 
4 1602024444 2002-02-16 

あなたは、標準の4桁の年形式で誕生日を持っていたら、それをそれは標準フォーマット"yyyy-mm-dd"で日付を返します。例えば、年齢を計算する。質問thisをご覧ください。

関連する問題