日付の使用|SAS Learning Modules
データ内の日付の読み取り
このモジュールでは、SASで日付変数の読み取り、日付関数の使用、日付表示形式の使用方法を説明します。 SASにデータを読み込むためのデータ手順、および新しい変数を計算するための代入文に精通していることを前提としています。 概念のいずれかが完全に新しい場合は、他の学習モジュールへの指示については、以下の詳細については、見てみたいことがあります。 次に、最初の例で使用したデータファイルを示します。
John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959
以下のプログラムはデータを読み取り、datesという一時データファイル 日付はdataステップで読み込まれ、date11の書式が設定されていることに注意してください。 日付を読み取るために使用されます。 p>
DATA dates; INPUT name $ 1-4 @6 bday date11.;CARDS;John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959;RUN;PROC PRINT DATA=dates;RUN;
proc printの出力を以下に示します。 データ内の日付をbdayの値と比較します。 Johnの場合、日付は1Jan1960であり、bdayの値は0であることに注意してください。 これは、日付が1960年1月1日からの日数としてSASに内部的に格納されているためです。 メアリーは1960年以前に生まれたので、彼女のためのbdayの値は負(-1635)です。 p>
OBS NAME BDAY 1 John 0 2 Mary -1635 3 Kate 1046 4 Mark -207
私たちが理解している方法で日付を表示するには、出力をフォーマットする必要があります。 私たちはdate9を使用します。 ddmmmyyyyの形式で日付を表示する形式です。 これはformat文で指定されます。 p>
PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
ここでは、上記のproc printステートメントによって生成された出力です。
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Kate 12NOV1962 4 Mark 08JUN1959
次のデータを見てみましょう。 一見すると、日付が非常に異なっているように見えますが、読むことができませんでした。 彼らは共通して二つのことを持っています:
1)それらはすべて数値の月を持っています、
2)それらはすべて月、日、そして年の順 これらの日付は、同じ形式mmddyy11で読み取ることができます。 データステップでその形式を使用する例を次に示します。 div>DATA dates; INPUT name $ 1-4 @6 bday mmddyy11.;CARDS;John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;上記のproc printの結果は、すべての日付が正しく読み取られていることを示しています。
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Joan 11JUL1955 4 Kate 12NOV1962 5 Mark 08JUN1959SASへの日付の読み取りに使用できるさまざまな形式があります。 以下は、これらの形式のいくつかのサンプルです。 p>
Informat Description Range Width Sample-------- ----------- ----- ------- ------JULIANw. Julian date 5-32 5 65001 YYDDDDDMMYYw. date values 6-32 6 14/8/1963MONYYw. month and year 5-32 5 JUN64YYMMDDw. date values 6-32 8 65/4/29YYQw. year and quarter 4-32 4 65Q1順序が月、年、日である次のデータを考えてみましょう。 次のデータステップのように、日付の各部分でこれらのデータを個別の変数で読み取ることができます。 dataステップの関数mdy(month,day,year)に注意してください。 この関数は、個々のコンポーネントから日付値を作成するために使用されます。 Proc printの結果は次のようになります。
OBS MONTH YEAR DAY BDAY 1 7 1948 11 11JUL1948 2 1 1960 1 01JAN1960 3 10 1970 15 15OCT1970 4 12 1971 10 10DEC1971二桁の日付
次のデータを考えてみましょう。
7 11 18 7 11 48 1 1 6010 15 7012 10 71データの読み取りは、私たちがやったのと同じです。
DATA dates; INPUT month day year ; bday=MDY(month,day,year);CARDS; 7 11 18 7 11 48 1 1 6010 15 7012 10 71;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;proc printの結果を以下に示します。
OBS MONTH DAY YEAR BDAY 1 7 11 18 11JUL1918 2 7 11 48 11JUL1948 3 1 1 60 01JAN1960 4 10 15 70 15OCT1970 5 12 10 71 10DEC1971SASはカットオフ(yearcutoff)を前提としているため、ここでは二桁の年が機能します。 デフォルトのyearcutoffは、SASのバージョンによって異なります。
SAS 6.12 and before (YEARCUTOFF=1900)SAS 7 and 8 (YEARCUTOFF=1920)次のプ これにより、20よりも低い2桁の年が2000年の後のように読み取られます。 このオプションが設定されている場合、同じプログラムを実行すると、異なる結果が得られます。
OPTIONS YEARCUTOFF=1920;DATA dates; INPUT month day year ; bday=MDY(month,day,year);CARDS; 7 11 18 7 11 48 1 1 6010 15 7012 10 71;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;proc printの結果を以下に示します。 最初の観測は現在、1918年ではなく2018年に発生していると読まれています。
OBS MONTH DAY YEAR BDAY 1 7 11 18 11JUL2018 2 7 11 48 11JUL1948 3 1 1 60 01JAN1960 4 10 15 70 15OCT1970 5 12 10 71 10DEC1971経過日を持つ計算
SASの日付変数は、日付を含む計算を非常に便利にします。 たとえば、2000年1月1日の全員の年齢を計算するには、データステップで次の変換を使用します。 p>
age2000=(mdy(1,1,2000)-bday)/365.25 ;コンテキストでこの計算を持つプログラムは次のとおりです。
OPTIONS YEARCUTOFF=1900; /* sets the cutoff back to the default */DATA dates; INPUT name $ 1-4 @6 bday mmddyy11.; age2000 = (MDY(1,1,2000)-bday)/365.25 ;CARDS;John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;proc printの結果を以下に示します。 変数AGE2000には、January1,2000の時点での年齢が含まれています。
OBS NAME BDAY AGE2000 1 John 01JAN1960 40.0000 2 Mary 11JUL1955 44.4764 3 Joan 11JUL1955 44.4764 4 Kate 12NOV1962 37.1362 5 Mark 08JUN1959 40.5667その他の便利な日付関数
日付変数で使用するための便利な関数がいくつかあります。 以下は、これらの関数のいくつかのリストです。 p>
Function Description Sample-------- --------------------- -----------------month() Extracts Month m=MONTH(bday);day() Extracts Day d=DAY(bday) ;year() Extracts Year y=YEAR(bday);weekday() Extracts Day of Week wk_d=WEEKDAY(bday);qtr() Extracts Quarter q=QTR(bday);次のプログラムは、これらの関数の使用を示しています。
DATA dates; INPUT name $ 1-4 @6 bday mmddyy11.; m=MONTH(bday); d=DAY(bday) ; y=YEAR(bday); wk_d=WEEKDAY(bday); q=QTR(bday);CARDS;John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959;RUN;PROC PRINT DATA=dates; VAR bday m d y; FORMAT bday date9. ;RUN;PROC PRINT DATA=dates; VAR bday wk_d q; FORMAT bday date9. ;RUN;procの印刷結果を以下に示します。 新しい変数には、月、日、年、曜日、および四半期が含まれます。
OBS BDAY M D Y 1 01JAN1960 1 1 1960 2 11JUL1955 7 11 1955 3 11JUL1955 7 11 1955 4 12NOV1962 11 12 1962 5 08JUN1959 6 8 1959OBS BDAY WK_D Q 1 01JAN1960 6 1 2 11JUL1955 2 3 3 11JUL1955 2 3 4 12NOV1962 2 4 5 08JUN1959 2 2概要
- 日付は日付形式、最も一般的にはdate9で読み込まれます。 そしてmmddyy11。
- 日付関数を使用して、コンポーネント(mdy(m、d、y))から日付値を作成し、日付値(month()、day()など)からコンポーネントを抽出することができます。).
- yearcutoffオプションは、二桁の年を読み取る必要がある場合に使用できます。
- 日付を調べるための問題は、単一の日付形式がそれらを読み取ることができないように、フィールド内に混在しています。 解決策:フィールドを文字フィールドとして読み取り、文字列をテストし、入力関数と適切な形式を使用して値を日付変数に読み取ります。
- 日付を読み取ることができる形式はありません。 解決策:日付をコンポーネントとして読み取り、関数を使用して日付値を生成します。
- yearcutoffのデフォルトは、上記のパッケージのバージョンのデフォルトではないことがあります。 ソリューション: YEARCUTOFFの現在の設定を決定するには、
PROC OPTIONS OPTION=YEARCUTOFF;RUN;
を含むプログラムを実行するだけで、YEARCUTOFFの現在の値が出力されます。