逆風に背中を向けて追い風に

ある理系のフリした文系人間の手記

Matlabでdatetimeを使わずに日付をyyyymmddの形にする方法

f:id:LingerBelong:20161122222629p:plain

こんばんは、ゆらとです。Matlabユーザーです。

Matlabは個人ライセンスではなく研究室のものです。

2011aとかいう古~いバージョンを使っています。


そのせいであの関数入ってないやん! と泣きを見ることも多々……。

使いたい関数を使えない


年間のcsvデータを読み込む作業がありました。

1日の気象データが入ったcsvファイルが1年分あるといった具合です。


具体的には

xxxx_20150101.csv
xxxx_20150102.csv
xxxx_20150103.csv
.
.
.
xxxx_20151231.csv


みたいなcsvファイル群があり、いっこいっこを読み取るという作業です。


あー、

date = datetime(2015, 1, 1);
ymd = yyyymmdd(date);
csvread('xxxx_%d.csv', ymd);

みたいにして、forで繰り返すなり行列作るなりすればいいかー


……なんて出来ればよかったんですが

datetimeのドキュメンテーション(現在の日付に基づく配列の作成と日付文字列または日付値からの変換 - MATLAB datetime - MathWorks 日本)を参照すると


f:id:LingerBelong:20161122221742p:plain

んんー????

f:id:LingerBelong:20161122221609p:plain

あっ……

f:id:LingerBelong:20161122221821p:plain

→いいえ


Matlab R2011aユーザーにとってdatetimeは時代を先取りしすぎた関数だったようです。


めげずに代替案を探る今日この頃です。

datetime関数を使わずに日付をyyyymmddの形に直す


というわけで、今回はdatetimeを使わずに日付をyyyymmddの形(20150101みたいな形)の数値データに変換する方法を紹介したいと思います!


基本的な流れとしては


  1. 年、月、日を入力する
  2. 入力された年月日をシリアル日付値に変換する
  3. シリアル日付値を日付の文字列に変換する
  4. 日付の文字列を日付ベクトルに変換する
  5. 8桁の日付値yyyymmddを出力する


こんなもんですねー。

ちなみに、シリアル日付値は0000年1月1日を1とする日付番号です。

2016年11月23日なら736657です。ちゃんと閏年も考えてくれてて優秀です。



じゃ、関数ファイルとして作りましょう



コマンドで実行すると

f:id:LingerBelong:20161123214638p:plain

こんな感じになります。やったね!



古いMatlabで戦っている方の一助になれたなら嬉しいです。



ここまで読んでくださってありがとうございました。