Main Content

テキストと datetime 値または duration 値の間の変換

この例では、テキストと日付および時刻を表すデータ型の間で変換を行う方法を説明します。datetime データ型は 2020 年 8 月 24 日午前 10 時 50 分 30 秒などの時点を表し、duration データ型は 3 時間、47 分、16 秒などの時間の長さを表します。日付と時刻をテキストに変換する一般的な理由は、それらをプロット ラベルやファイル名として使用される string に追加することです。同様に、ファイルに日付と時刻をテキストとして格納するデータの列がある場合は、そのデータをこれらの列から datetime 配列または duration 配列に読み取ることができ、データが解析にさらに役立つようになります。

次のように変換してください。

  • datetime 値または duration 値からテキストへは、関数 string を使用します。(関数 char を使用して、これらの値を文字ベクトルに変換することもできます。)

  • テキストから datetime 値へは、関数 datetime を使用します。

  • テキストから duration 値へは、関数 duration を使用します。

また、関数 readcellreadvarsreadtable などの一部の関数は、ファイルからテキストを読み取って、日付と時刻を表すテキストを datetime 配列または duration 配列に自動的に変換します。

datetime 値と duration 値からテキストへの変換

現在の日付と時刻を表す datetime 値を作成します。

d = datetime("now")
d = datetime
   12-Aug-2022 19:57:12

d をテキストに変換するには、関数 string を使用します。

str = string(d)
str = 
"12-Aug-2022 19:57:12"

同様に、duration 値を変換できます。たとえば、まず 3 時間と 30 分を表す duration 値を作成します。この値を作成する 1 つの方法は、関数 hours と関数 minutes を使用することです。これらの関数は、結合できる duration 値を作成します。

d = hours(3) + minutes(30)
d = duration
   3.5 hr

d をテキストに変換します。

str = string(d)
str = 
"3.5 hr"

このような string の一般的な用途の 1 つに、プロット ラベルやファイル名への追加があります。たとえば、今日の日付を含むタイトルをもつ簡単なプロットを作成します。まず、日付を変換して string myTitle に追加します。

d = datetime("today")
d = datetime
   12-Aug-2022

myTitle = "Plot generated on: " + string(d)
myTitle = 
"Plot generated on: 12-Aug-2022"

そのタイトルをもつプロットを作成します。

plot(rand(10,1))
title(myTitle)

Figure contains an axes object. The axes object with title Plot generated on: 12-Aug-2022 contains an object of type line.

配列から string 配列への変換

datetime 値または duration 値の配列も変換できます。関数 string を使用して変換すると、結果として得られる string 配列は同じサイズになります。

たとえば、datetime 配列を作成します。

D = datetime(2021,1:3,15,12,0,0)'
D = 3x1 datetime
   15-Jan-2021 12:00:00
   15-Feb-2021 12:00:00
   15-Mar-2021 12:00:00

D を string 配列に変換します。

str = string(D)
str = 3x1 string
    "15-Jan-2021 12:00:00"
    "15-Feb-2021 12:00:00"
    "15-Mar-2021 12:00:00"

同様に、duration 配列を作成して変換します。duration 配列を作成する 1 つの方法は、関数 duration を使用することです。時間、分、秒を指定する数値入力で呼び出します。

D = duration(1:3,30,0)'
D = 3x1 duration
   01:30:00
   02:30:00
   03:30:00

duration 配列を変換します。

str = string(D)
str = 3x1 string
    "01:30:00"
    "02:30:00"
    "03:30:00"

出力テキストの形式の指定

datetimeduration のデータ型には、表示形式を指定するプロパティがあります。ライブ スクリプトとコマンド ウィンドウでは、その形式を使用して値が表示されます。関数 string を使用して datetime 配列または duration 配列を変換する際に、別の形式を指定できます。

たとえば、datetime 値を作成して表示します。

d = datetime("now")
d = datetime
   12-Aug-2022 19:57:13

月、日、年、時刻の完全名を表す文字識別子を使用して形式を指定します。d を、その形式を使用して日付と時刻を表す string に変換します。

fmt = "dd MMMM yyyy, hh:mm:ss a";
str = string(d,fmt)
str = 
"12 August 2022, 07:57:13 PM"

同様に、duration 配列を変換する際に形式を指定できます。まず、duration 値を作成します。

d = hours(1) + minutes(30) + seconds(45)
d = duration
   1.5125 hr

時間、分、秒を表す識別子 hh:mm:ss を使用して、d を string に変換します。

fmt = "hh:mm:ss";
string(d,fmt)
ans = 
"01:30:45"

メモ: 関数 string では、他のデータ型を変換する場合、2 番目の形式の入力引数は提供されません。

出力テキストのロケールの指定

異なるロケールを使用した datetime 配列と duration 配列の変換もできます。ロケールには、日と月を表す適切な名前があります。既定のロケール以外のロケールを使用するには、それを別の入力引数として指定します。

たとえば、ロケールとして fr_FR を指定し、フランス語の月名を使用して現在の日付と時刻を表します。

d = datetime("now")
d = datetime
   12-Aug-2022 19:57:13

fmt = "dd MMMM yyyy, hh:mm:ss a";
locale = "fr_FR";
str = string(d,fmt,locale)
str = 
"12 août 2022, 07:57:13 PM"

同様に、duration 配列を変換する際にロケールを指定できます。フランス語のロケールでは、時間について異なる略語が使用されます。

d = hours(5)
d = duration
   5 hr

fmt = "h";
locale = "fr_FR";
str = string(d,fmt,locale)
str = 
"5 h"

メモ: 関数 string では、他のデータ型を変換する場合、3 番目のロケールの入力引数は提供されません。

テキストから datetime 値への変換

テキストで、日付と時刻が関数 datetime によって認識される形式で指定されている場合は、そのテキストを datetime 値に変換できます。

日付と時刻を表す string を作成します。

str = "2021-09-15 09:12:34"
str = 
"2021-09-15 09:12:34"

strdatetime 値に変換します。

d = datetime(str)
d = datetime
   15-Sep-2021 09:12:34

入力テキストの形式の解釈

関数 datetime は、一般的に使用される多くのテキスト形式を認識します。ただし、テキストが datetime で認識されない形式の場合は、入力引数として形式を指定できます。

たとえば、ISO 8601 規格を使用して日付と時刻を指定する string を作成します。

str = "2021-09-15T091234"
str = 
"2021-09-15T091234"

関数 datetime はこの形式を認識しません。この string を datetime 値に変換するには、入力テキストの形式を指定します。次に、関数 datetime を呼び出します。(形式にリテラル テキストが含まれる場合は、引用符で囲みます。この例では、リテラル テキスト T'T' と指定します。)

infmt = "yyyy-MM-dd'T'HHmmss";
d = datetime(str,"InputFormat",infmt)
d = datetime
   15-Sep-2021 09:12:34

テキストから duration 値への変換

テキストで、時間が関数 duration によって認識される形式で指定されている場合は、そのテキストを duration 値に変換できます。

時間の長さを表す string を作成します。

str = "00:34:01"
str = 
"00:34:01"

strduration 値に変換します。

d = duration(str)
d = duration
   00:34:01

入力テキストの形式の解釈

関数 duration は、コロンで区切られた日数、時間数、分数、秒数を指定する形式を認識します。このような形式は次のとおりです。

  • "dd:hh:mm:ss"

  • "hh:mm:ss"

  • "mm:ss"

  • "hh:mm"

  • 最大 9 個の文字 S で秒の小数部を示す、最初から 3 つの形式のいずれか ("hh:mm:ss.SSSS" など)

入力テキストがあいまいな場合、つまり "mm:ss" 形式または "hh:mm" 形式と一致すると解釈される可能性がある場合は、入力引数として形式を指定します。

たとえば、時間の長さを表す string を作成します。

str = "34:01"
str = 
"34:01"

この string を 34 分 1 秒の duration に変換するには、形式を指定します。次に、関数 duration を呼び出します。

infmt = "mm:ss";
d = duration(str,"InputFormat",infmt)
d = duration
   00:34:01

ファイルからの日付と時刻の読み取り

スプレッドシートやテキスト ファイルなどの多くのファイルでは、日付と時刻がテキストとして保存されます。日付と時刻が認識される形式の場合、readcellreadvarsreadtable などの関数は、それらを読み取って datetime 配列または duration 配列に自動的に変換できます。

たとえば、CSV ファイル outages.csv は、MATLAB® に同梱されているサンプル ファイルです。このファイルには一連の停電のデータが含まれています。outages.csv の最初の行は列名です。ファイルの残りは、停電ごとのコンマ区切りのデータ値です。このファイルには 1468 行のデータが含まれています。最初の数行を以下に示します。

Region,OutageTime,Loss,Customers,RestorationTime,Cause
SouthWest,2002-02-01 12:18,458.9772218,1820159.482,2002-02-07 16:50,winter storm
SouthEast,2003-01-23 00:49,530.1399497,212035.3001,,winter storm
SouthEast,2003-02-07 21:15,289.4035493,142938.6282,2003-02-17 08:14,winter storm
West,2004-04-06 05:44,434.8053524,340371.0338,2004-04-06 06:10,equipment fault
MidWest,2002-03-16 06:18,186.4367788,212754.055,2002-03-18 23:23,severe storm
...

outages.csv から最初の 3 列を読み取って配列に直接格納するには、関数 readvars を使用します。テキストを string 配列が格納される変数に読み取るには、名前と値の引数 TextType を指定します。ただし、この関数は CSV ファイルの 2 列目の値を日付と時刻として認識し、変数 OutageTimedatetime 配列として作成します。各出力配列の最初の 5 行を表示します。

[Region,OutageTime,Loss] = readvars("outages.csv","TextType","string");
whos Region OutageTime Loss
  Name               Size            Bytes  Class       Attributes

  Loss            1468x1             11744  double                
  OutageTime      1468x1             23520  datetime              
  Region          1468x1             83256  string                
Loss(1:5)
ans = 5×1

  458.9772
  530.1399
  289.4035
  434.8054
  186.4368

OutageTime(1:5)
ans = 5x1 datetime
   2002-02-01 12:18
   2003-01-23 00:49
   2003-02-07 21:15
   2004-04-06 05:44
   2002-03-16 06:18

Region(1:5)
ans = 5x1 string
    "SouthWest"
    "SouthEast"
    "SouthEast"
    "West"
    "MidWest"

スプレッドシート全体を読み取ってデータを table に格納するには、関数 readtable を使用します。テキストを string 配列が格納される table 変数に読み取るには、名前と値の引数 TextType を指定します。ただし、readtable は、OutageTimeRestorationTimedatetime 配列が格納される table 変数に変換します。

T = readtable("outages.csv","TextType","string")
T=1468×6 table
      Region          OutageTime        Loss     Customers     RestorationTime           Cause      
    ___________    ________________    ______    __________    ________________    _________________

    "SouthWest"    2002-02-01 12:18    458.98    1.8202e+06    2002-02-07 16:50    "winter storm"   
    "SouthEast"    2003-01-23 00:49    530.14    2.1204e+05                 NaT    "winter storm"   
    "SouthEast"    2003-02-07 21:15     289.4    1.4294e+05    2003-02-17 08:14    "winter storm"   
    "West"         2004-04-06 05:44    434.81    3.4037e+05    2004-04-06 06:10    "equipment fault"
    "MidWest"      2002-03-16 06:18    186.44    2.1275e+05    2002-03-18 23:23    "severe storm"   
    "West"         2003-06-18 02:49         0             0    2003-06-18 10:54    "attack"         
    "West"         2004-06-20 14:39    231.29           NaN    2004-06-20 19:16    "equipment fault"
    "West"         2002-06-06 19:28    311.86           NaN    2002-06-07 00:51    "equipment fault"
    "NorthEast"    2003-07-16 16:23    239.93         49434    2003-07-17 01:12    "fire"           
    "MidWest"      2004-09-27 11:09    286.72         66104    2004-09-27 16:37    "equipment fault"
    "SouthEast"    2004-09-05 17:48    73.387         36073    2004-09-05 20:46    "equipment fault"
    "West"         2004-05-21 21:45    159.99           NaN    2004-05-22 04:23    "equipment fault"
    "SouthEast"    2002-09-01 18:22    95.917         36759    2002-09-01 19:12    "severe storm"   
    "SouthEast"    2003-09-27 07:32       NaN    3.5517e+05    2003-10-04 07:02    "severe storm"   
    "West"         2003-11-12 06:12    254.09    9.2429e+05    2003-11-17 02:04    "winter storm"   
    "NorthEast"    2004-09-18 05:54         0             0                 NaT    "equipment fault"
      ⋮

これらの table 変数は datetime 配列であるため、これらを使用して便利な計算を実行できます。たとえば、停電の継続期間を計算して table に duration 配列として付加できます。

T.OutageDuration = T.RestorationTime - T.OutageTime
T=1468×7 table
      Region          OutageTime        Loss     Customers     RestorationTime           Cause          OutageDuration
    ___________    ________________    ______    __________    ________________    _________________    ______________

    "SouthWest"    2002-02-01 12:18    458.98    1.8202e+06    2002-02-07 16:50    "winter storm"         148:32:00   
    "SouthEast"    2003-01-23 00:49    530.14    2.1204e+05                 NaT    "winter storm"               NaN   
    "SouthEast"    2003-02-07 21:15     289.4    1.4294e+05    2003-02-17 08:14    "winter storm"         226:59:00   
    "West"         2004-04-06 05:44    434.81    3.4037e+05    2004-04-06 06:10    "equipment fault"       00:26:00   
    "MidWest"      2002-03-16 06:18    186.44    2.1275e+05    2002-03-18 23:23    "severe storm"          65:05:00   
    "West"         2003-06-18 02:49         0             0    2003-06-18 10:54    "attack"                08:05:00   
    "West"         2004-06-20 14:39    231.29           NaN    2004-06-20 19:16    "equipment fault"       04:37:00   
    "West"         2002-06-06 19:28    311.86           NaN    2002-06-07 00:51    "equipment fault"       05:23:00   
    "NorthEast"    2003-07-16 16:23    239.93         49434    2003-07-17 01:12    "fire"                  08:49:00   
    "MidWest"      2004-09-27 11:09    286.72         66104    2004-09-27 16:37    "equipment fault"       05:28:00   
    "SouthEast"    2004-09-05 17:48    73.387         36073    2004-09-05 20:46    "equipment fault"       02:58:00   
    "West"         2004-05-21 21:45    159.99           NaN    2004-05-22 04:23    "equipment fault"       06:38:00   
    "SouthEast"    2002-09-01 18:22    95.917         36759    2002-09-01 19:12    "severe storm"          00:50:00   
    "SouthEast"    2003-09-27 07:32       NaN    3.5517e+05    2003-10-04 07:02    "severe storm"         167:30:00   
    "West"         2003-11-12 06:12    254.09    9.2429e+05    2003-11-17 02:04    "winter storm"         115:52:00   
    "NorthEast"    2004-09-18 05:54         0             0                 NaT    "equipment fault"            NaN   
      ⋮

参考

| | | | | | | | | | | |

関連するトピック

外部の Web サイト