ラベル [▼ 日付・時間操作 の投稿を表示しています。 すべての投稿を表示
ラベル [▼ 日付・時間操作 の投稿を表示しています。 すべての投稿を表示

2019年1月30日水曜日

HMS関数で時間値を簡単に作る




HMS関数を使うと、簡単に時間値を作れます。


構文
HMS,  ,   )



data DT1;

   * 時 ;
   H   = 20;

   * 分 ;
   M   = 10;

   * 秒 ;
   S    = 05;

   * 時間値を作成 ;
   format TM1 TM2 time10. ;
   TM1 = hms( H, M, 0 );
   TM2 = hms( H, M, S );
run;


S
TM1 
TM2 
  20  
  10  
  05 
  20:10:00  
  20:10:05  


また特定の時間値を作りたい場合は、以下のような書き方が楽。
http://sas-boubi.blogspot.com/2018/03/blog-post.html

data DT2;
   format TM1 time10. ;
   TM1 = '20:10:05't;
run;

2018年3月27日火曜日

日付・時間・日時の書き方




例えば、2018/03/27という日付値を作りたい時、
以下のように書かれる方も多いと思います。(私もそうですが)

data DT1;
   format x date9.;
   x = input('2018/03/27',yymmdd10.);
run;


ですが、もっと簡単に日付値(と時間値・日時値)を作ることが出来ます。




日付値を作る

「'ddmmmyyyy'd」 という書式で日付値を作ることが出来ます。

data DT1;
    format x date9.;
    x = '27mar2018'd;
run;




時間値を作る

「'hh:mm:ss.s't」 という書式で時間値を作ることが出来ます。

data DT2;
    format x y z time11.2;
    x = '23:05't;
    y = '23:05:10't;
    z = '11:05:10pm't;
run;




日時値を作る

「'ddmmmyyyy:hh:mm:ss.s'dt」 という書式で日時値を作ることが出来ます。

data DT3;
    format x y z datetime21.2;
    x = '27mar2018:23:05'dt;
    y = '27mar2018:23:05:10'dt;
    z = '27mar2018:11:05:10pm'dt;
run;



時間値と日時値で「am/pm」が指定できるのは知らなかったなぁ、常識なのかな。
また一歩SASマスターに近づいた。


2016年5月2日月曜日

日付から年や月などを取り出す




日付値から 「年,月日」 を取り出す

data DT1;
  format A yymmdd10.;
  A = '05jan2014'd;
  A1 = year(A);      * 年 ;
  A2 = month(A);   * 月 ;
  A3 = day(A);        * 日 ;
run;

 A
A1
  A2   
  A3   
 2014-01-05  
  2014  
    1 
    5



日時値から 「年秒」 を取り出す


日時値から年・月・日を取り出すには、DATEPART関数で日付値に変換してからYEAR関数等を使用します

当然ながら、時・分・秒を取り出す場合は、日時のままでok (DATEPART関数は不要)

data DT2;
  format A e8601dt19.;
  A = '05jan2014 10:20:8'dt;
  A1 = year( datepart(A) );      * 年 ;
  A2 = month( datepart(A) );   * 月 ;
  A3 = day( datepart(A) );       * 日 ;
  A4 = hour(A);                      * 時 ;
  A5 = minute(A);                  * 分 ;
  A6 = second(A);                  * 秒 ;
run;

A
A1
 A2 
 A3 
 A4 
 A5  
 A6 
 2014-01-05T10:20:08 
  2014 
   1 
   5
  10 
  20
   8



1つ気をつけた方が良いのは、日時にミリ秒を含む場合。

注意:ミリ秒を含む場合

data DT3;
  format A e8601dt23.3;
  A = '05jan2014 10:20:8.721'dt;
  A1 = second(A);
run;

 A
A1
 2014-01-05T10:20:08.721 
  8.72099995・・・以下省略  

秒にミリ秒を含める場合は、「秒+(ミリ秒÷1000)」って感じになると思いますが、
SECOND関数で取得したミリ秒部分(小数点以下)に誤差?が出てしまうのでご注意ください。


2015年5月27日水曜日

NLDATM関数で、日時値を好きな書式で文字変換する。


以下の2つとセットの記事です。
NLDATE関数で、日付値を好きな書式で文字変換する。
NLTIME関数で、時間値を好きな書式で文字変換する。


NLDATM関数を使うと、
日時値に対して、好みの区切り文字を設定して、文字に変換できます。

構文
 NLDATM( 対象変数, 'ディスクリプタによる変換方法を指定' )

ディスクリプタ
 %Y  …  4桁の年
 %y  …  2桁の年
 %m  …  月
 %d  …  日

 %H …  時間(24時間表記)
 %I   … 時間(12時間表記)
 %M …  分
 %S …  秒

・ディスクリプタは大文字・小文字の違いに注意して下さい。
(例えば「%Y」と「%y」)
・第2引数はシングルクォーテーションで囲む(ダブルクォーテーションはNG)



data DT1;

  length VAR2 $50.;
  VAR = input('2014/01/04 15:20:00', ymddttm.);

  * 「2014年01月04日 15時20分00秒」 という文字に変換;
  VAR2 = nldatm( VAR , '%Y年%m月%d日 %H時%M分%S秒' ) ;
run;



上の例では月や日、秒などの頭に0がついてます。
0を取りたい場合、以下のように「%」の後に「#」を入れてやります。

data DT2;
  length VAR3 $50.;
  set DT1;

  * 「2014年1月4日 15時20分0秒」 という文字に変換;
  VAR3 = nldatm( VAR , '%Y年%#m月%#d日 %#H時%#M分%#S秒' ) ;
run;


NLTIME関数で、時間値を好きな書式で文字変換する。


以下の2つとセットの記事です。
NLDATE関数で、日付値を好きな書式で文字変換する。
NLDATM関数で、日時値を好きな書式で文字変換する。


NLTIME関数を使うと、
時間値に対して、好みの区切り文字を設定して、文字に変換できます。

構文
 NLTIME( 対象変数, 'ディスクリプタによる変換方法を指定' )

ディスクリプタ
 %H …  時間(24時間表記)
 %I   … 時間(12時間表記)
 %M …  分
 %S …  秒

・ディスクリプタは大文字・小文字の違いに注意して下さい。
(例えば「%M」を「%m」と記述すると無効な引数として処理が失敗してしまいます)
・第2引数はシングルクォーテーションで囲む(ダブルクォーテーションはNG)


data DT1;
  length A1 - A3 $50.;

  A = '23:05't;
  A1 = nltime(A, '%H時%M分');          /* 23時05分 */
  A2 = nltime(A, '%H時%M分%S秒');  /* 23時05分00秒 */
  A3 = nltime(A, '%I時%M分');           /* 11時05分 */
run;



「23時05分00秒」というように分や秒の頭に0が入ってるので、
これを取りたい場合、「%」の後に「#」を入れてやります。

data DT2;
  length A4 $50.;
  set DT1;

  * 「23時5分0秒」 という文字に変換;
  A4 = nldatm( A , '%#H時%#M%#S秒' ) ;
run;

2015年1月15日木曜日

SASにおける日付,時間,日時の概念について。


まずは以下のプログラムと実行結果を見てみましょう。

data DT1;
  format A yymmdd10.  B time8.  C e8601dt19. ;

  A = 0;
  B = 0;
  C = 0;
  output;

  A = 1;
  B = 1;
  C = 1;
  output;
run;


 A
B
 1960-01-01  
  0:00:00  
 1960-01-01T00:00:00  
 1960-01-02  
  0:00:01  
 1960-01-01T00:00:01  


数値「0」と「1」に対して、日付フォーマット、時刻フォーマット、日時フォーマットを割り当てた結果です。


ここから以下の事が分かります。


「日付値」は 1960年1月1日 を起算として、+1すると1日増える。
「時間値」は 0時間0分0秒 を起算として、+1すると1秒増える。
「日時値」は 1960年1月1日 0時間0分0秒 を起算として、+1すると1秒増える。



それで?って感じですが、これを知ってると、日付計算が楽になります。
例えば、ある日時変数があって、その日時の10分後を計算したいとかって場合に、

   「日時変数 + (10分×60秒)」

と計算すれば良いことがわかります。


関数で日時操作する方法もあるので、参考まで。
日付値と時間値から、日時値を作る小技。
日時値に、時間や日を足す簡単な方法。

2015年1月9日金曜日

日時値に、時間や日を足す簡単な方法。




ある日時の、2時間後、1日後、5秒前とかをDHMS関数で簡単に求める方法を発見したので紹介します。
日付値と時間値から、日時値を作る小技。」を発展させたやり方なので、まずはそちらをご覧ください。




書き方


第4引数に元となる日時をいれて、あとは足したい日数,時間,分を第1引数から順番に指定すればok。
DHMS( 日数 , 時間 ,  , 日時  )


秒も足したい場合は、第4引数に「日時+秒」みたいな感じで書けばいけます。
DHMS( 日数 ,  ,  , 日時 + 秒  )






data DT1;
  format A B C D E e8601dt19.;

  A = input( '2001-02-10T10:20:30', e8601dt19. );

  * 2時間後 ;
  B = dhms( 0, 2, 0, A );

  * 2時間前 ;
  C = dhms( 0, -2, 0, A );

  * 1日と2時間後 ;
  D = dhms( 1, 2, 0, A );

  * 2時間5秒後 ;
  E = dhms( 0, 2, 0, A+5 );
run;


結果
A = 2001-02-10T10:20:30 元の日時値

B = 2001-02-10T12:20:30 2時間後
C = 2001-02-10T08:20:30 2時間前
D = 2001-02-11T12:20:30 1日と2時間後
E = 2001-02-10T12:20:35 2時間5秒後





2014年12月15日月曜日

日付値と時間値から、日時値を作る小技。





DHMS関数で日時値を簡単に作ることが出来ます。



まずは 日付値、時、分、秒 から日時値を作る方法。


構文
DHMS日付値,  ,  ,   )



data DT1;
   format DT yymmdd10. H M S 8. DTM e8601dt19.;

   * 日付値 ;
   DT  = input("2014/01/10", yymmdd10.);

   * 時 ;
   H   = 20;

   * 分 ;
   M   = 10;

   * 秒 ;
   S   = 00;

   * 日時値を作成 ;
   DTM = dhms(DT, H, M, S);
run;


 DT 
S
DTM 
  2014-01-10  
  20  
  10  
  0  
  2014-01-10T20:10:00  



マニュアルにも載ってる小技ですが
日付値と時間値から、日時値を作る事も出来ます。


構文
DHMS日付値,  0,  0,  時間値 )




data DT1;
   format DT yymmdd10.  TM time5.  DTM e8601dt19.;

   * 日付値 ;
   DT  = input("2014/01/10", yymmdd10.);

   * 時間値 ;
   TM  = input("20:10", time5.);

   * 日時値を作成 ;
   DTM = dhms(DT, 0, 0, TM);
run;


 DT 
TM 
DTM 
  2014-01-10  
  20:10  
  2014-01-10T20:10:00  


2014年12月4日木曜日

日時値から、日付値または時間値を抽出する



わりとこの質問を沢山もらうので、紹介したいと思います。


日時値に対して、DATEPART関数で日付値を抽出し、TIMEPART関数で時間値を抽出します。

data DT1;
   format DT yymmdd10. TM time5.;

   * 適当な日時値を作成 ;
   DTM  = input("2014/07/01 10:20:00", ymddttm.);

   * 日付値を抽出 ;
   DT   = datepart( DTM ) ;

   * 時間値を抽出 ;
   TM   = timepart( DTM ) ;

   keep DT TM;
run;


 DT 
TM 
  2014-07-01  
  10:20  


2014年10月17日金曜日

日付値を簡単に作るMDY関数の紹介


MDY関数は「月、日、年」の順に引数を指定することで、簡単に日付値を作れます。

構文
MDY( 月, 日, 年 )


*** 例1 ;
data DT1;
  format YMD yymmdd10. ;
  YMD = mdy( 10,17, 2014 ) ;
run;


以下のように、年,月,日を分けて変数に入れてる場合も、MDY関数を使えば一発です。
*** 例2 ;
data DT2;
   format YMD yymmdd10. ;
   Y = 2014;
   M = 10;
   D = 17;
   YMD = mdy( M, D, Y ) ;
run;


覚えておくととても便利です。

2014年8月29日金曜日

NLDATE関数で、日付値を好きな書式で文字変換する。


以下の2つとセットの記事です。
NLTIME関数で、時間値を好きな書式で文字変換する。
NLDATM関数で、日時値を好きな書式で文字変換する。


NLDATE関数を使うと、
日付値に対して、好みの書式で文字変換できます。

構文
 NLDATE( 対象変数, 'ディスクリプタによる変換方法を指定' )

ディスクリプタ
 %Y  …  4桁の年
 %y  …  2桁の年
 %m  …  月
 %d  …  日

・ディスクリプタは大文字・小文字の違いに注意して下さい。
(例えば「%Y」と「%y」)

・第2引数はシングルクォーテーションで囲む(ダブルクォーテーションはNG)


data DT1;
  length A1 - A3 $30.;
  A = '05jan2014'd;
  A1 = nldate(A, '%Y年%m月%d日');  /* 2014年01月05日 */
  A2 = nldate(A, '%y年%m月%d日');  /* 14年01月05日 */
  A3 = nldate(A, '%y年%m月頃');      /* 14年01月頃 */
run;



上の例では「2014年01月05日」のように月と日の頭に0がつきます。
この0を取りたい場合、以下のように「%」の後に「#」を入れてやります。


data DT2;
  length A4 $30.;
  set DT1;
  A4 = nldate(A, '%Y年%#m月%#d日');  /* 2014年1月5日 */
run;



2014年2月14日金曜日

日本語の西暦・和暦を日付値に変換する。




日本語で入力された西暦・和暦を日付値に変換する方法を紹介します。



サンプルデータ作成

data DT1;
   length C1-C4 $30.;

   C1 = "2000/02/01";
   C2 = "2000年2月1日";
   C3 = "H12/02/01";
   C4 = "平成12年2月1日";
run;





  • 日本語を含む和暦は「JNENGO」というインフォーマットが用意されてるので変換が楽。
  • 日本語を含む西暦は漢字の「年」「月」「日」をKTRANSLATE関数で「/」に置換してから変換するなど工夫が必要。
 *** 「2000/02/01」 ;
  N1 = input( C1, yymmdd10. ) ;

 *** 「2000年2月1日」 ;
  N2 = input( ktranslate(C2,"/","年","/","月","","日") ,yymmdd10.) ;

 *** 「H12/02/01」 ;
  N3 = input( C3, nengo9. ) ;

 *** 「平成12年2月1日」 ;
  N4 = input( C4, jnengo32. ) ;