主要内容

在文本与 datetimeduration 值之间转换

此示例说明如何在表示日期和时间的数据类型与文本之间进行转换。datetime 数据类型表示时间点,例如 2020 年 8 月 24 日上午 10:50:30,duration 数据类型表示时间长度,例如 3 小时 47 分 16 秒。将日期和时间转换为文本的常见原因是将其追加到用作绘图标签或文件名的字符串中。同样,如果文件中有以文本形式存储日期和时间的数据列,您可以将这些列的数据读取到 datetimeduration 数组中,使数据更便于分析。

要转换:

  • datetimeduration 值转换为文本,使用 string 函数。(您也可以使用 char 函数将这些值转换为字符向量。)

  • 将文本转换为 datetime 值,使用 datetime 函数。

  • 将文本转换为 duration 值,使用 duration 函数。

此外,某些函数(如 readcellreadvarsreadtable 函数)会从文件中读取文本,并自动将表示日期和时间的文本转换为 datetimeduration 数组。

datetimeduration 值转换为文本

创建一个表示当前日期和时间的 datetime 值。

d = datetime("now")
d = datetime
   09-Aug-2025 11:58:02

要将 d 转换为文本,请使用 string 函数。

str = string(d)
str = 
"09-Aug-2025 11:58:02"

同样,您可以转换 duration 值。例如,首先创建一个表示 3 小时 30 分钟的 duration 值。创建此值的一种方法是使用 hoursminutes 函数。这些函数创建 duration 值,然后您可以将其合并。

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

d 转换为文本。

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

此类字符串的常见用途是将其添加到绘图标签或文件名中。例如,创建一个简单的绘图,其标题中包含今天的日期。首先转换日期并将其添加到字符串 myTitle 中。

d = datetime("today")
d = datetime
   09-Aug-2025

myTitle = "Plot generated on: " + string(d)
myTitle = 
"Plot generated on: 09-Aug-2025"

使用您的标题创建绘图。

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

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

将数组转换为字符串数组

您还可以转换 datetimeduration 值的数组。当您使用 string 函数转换它们时,生成的字符串数组具有相同的大小。

例如,创建一个 datetime 数组。

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

D 转换为字符串数组。

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

同样,您可以创建一个 duration 数组并转换它。创建 duration 数组的一种方法是使用 duration 函数。使用指定小时、分钟和秒的数值输入调用该函数。

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

转换 duration 数组。

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

指定输出文本的格式

datetimeduration 数据类型具有指定显示格式的属性。实时脚本和命令行窗口使用该格式显示值。当您使用 string 函数转换 datetimeduration 数组时,可以指定不同格式。

例如,创建一个 datetime 值并显示它。

d = datetime("now")
d = datetime
   09-Aug-2025 11:58:04

使用表示月份全称、日期、年份和时间的字母标识符指定格式。使用该格式将 d 转换为表示日期和时间的字符串。

fmt = "dd MMMM yyyy, hh:mm:ss a";
str = string(d,fmt)
str = 
"09 August 2025, 11:58:04 AM"

同样,您可以在转换 duration 数组时指定格式。首先创建一个 duration 值。

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

使用标识符 hh:mm:ssd 转换为表示小时、分钟和秒的字符串。

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

注意:string 函数在转换其他数据类型时不提供用于格式的第二个输入参量。

指定输出文本的区域设置

您还可以使用不同区域设置转换 datetimeduration 数组。区域设置提供适当的日期和月份名称。要使用非默认区域设置,请将其作为另一个输入参量提供。

例如,指定 fr_FR 作为区域设置,以使用法语月份名称表示当前日期和时间。

d = datetime("now")
d = datetime
   09-Aug-2025 11:58:04

fmt = "dd MMMM yyyy, hh:mm:ss a";
locale = "fr_FR";
str = string(d,fmt,locale)
str = 
"09 août 2025, 11:58:04 AM"

同样,您可以在转换 duration 数组时指定区域设置。法国的区域设置使用不同的缩写表示小时。

d = hours(5)
d = duration
   5 hr

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

注意:在转换其他数据类型时,string 函数不提供用于区域设置的第三个输入参量。

将文本转换为 datetime

如果文本以 datetime 函数识别的格式指定日期和时间,您可以将文本转换为 datetime 值。

创建一个表示日期和时间的字符串。

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

str 转换为 datetime 值。

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

解释输入文本的格式

datetime 函数能够识别许多常用的文本格式。但是,如果 datetime 无法识别您的文本格式,您可以将格式指定为一个输入参量。

例如,创建一个使用 ISO 8601 标准指定日期和时间的字符串。

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

datetime 函数不能识别此格式。要将此字符串转换为 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 值。

创建一个表示时间长度的字符串。

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

str 转换为 duration 值。

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

解释输入文本的格式

duration 函数能够识别以冒号分隔指定日期、小时、分钟和秒的格式。这些格式包括:

  • "dd:hh:mm:ss"

  • "hh:mm:ss"

  • "mm:ss"

  • "hh:mm"

  • 前三种格式中的任何一种,再加上最多九个 S 字符指示秒的小数位,例如 "hh:mm:ss.SSSS"

如果输入文本具有多义性,即可能解释为匹配 "mm:ss""hh:mm" 格式,请将格式指定为输入参量。

例如,创建一个表示时间长度的字符串。

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

要将此字符串转换为 34 分 1 秒的持续时间,请指定格式。然后,调用 duration 函数。

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

从文件中读取日期和时间

许多文件(如电子表格和文本文件)将日期和时间存储为文本。如果日期和时间采用识别的格式,则 readcellreadvarsreadtable 等函数可以读取它们并自动将其转换为 datetimeduration 数组。

例如,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 读取前三列并直接将其存储到数组中,请使用 readvars 函数。要将文本读取到存储字符串数组的变量中,请指定 TextType 名称-值参量。但是,该函数将 CSV 文件第二列中的值识别为日期和时间,并将 OutageTime 变量创建为 datetime 数组。显示每个输出数组的前五行。

[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             83272  string                
Loss(1:5)
ans = 5×1

  458.9772
  530.1399
  289.4035
  434.8054
  186.4368

OutageTime(1:5)
ans = 5×1 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 = 5×1 string
    "SouthWest"
    "SouthEast"
    "SouthEast"
    "West"
    "MidWest"

要读取整个电子表格并将数据存储在表中,请使用 readtable 函数。要将文本读取到存储字符串数组的表变量中,请指定 TextType 名称-值参量。但是,readtable 仍将 OutageTimeRestorationTime 转换为用于存储 datetime 数组的表变量。

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"
      ⋮

由于这些表变量是 datetime 数组,您可以对其执行便捷的计算。例如,您可以计算停电的持续时间并将其作为一个 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   
      ⋮

另请参阅

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

主题

外部网站