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
   03-Aug-2023 20:45:24

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

str = string(d)
str = 
"03-Aug-2023 20:45:24"

同様に、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
   03-Aug-2023

myTitle = "Plot generated on: " + string(d)
myTitle = 
"Plot generated on: 03-Aug-2023"

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

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

Figure contains an axes object. The axes object with title Plot generated on: 03-Aug-2023 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
   03-Aug-2023 20:45:27

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

fmt = "dd MMMM yyyy, hh:mm:ss a";
str = string(d,fmt)
str = 
"03 August 2023, 08:45:27 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
   03-Aug-2023 20:45:27

fmt = "dd MMMM yyyy, hh:mm:ss a";
locale = "fr_FR";
str = string(d,fmt,locale)
str = 
"03 août 2023, 08:45:27 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             23488  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
   01-Feb-2002 12:18:00
   23-Jan-2003 00:49:00
   07-Feb-2003 21:15:00
   06-Apr-2004 05:44:00
   16-Mar-2002 06:18:00

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

参考

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

関連するトピック

外部の Web サイト