Main Content

处理和转换日期

日期格式

几乎所有金融数据都来自于时间序列,Financial Toolbox™ 中的函数具有广泛的日期处理功能。工具箱函数支持以字符向量、日期时间数组或日期序列值形式表示的日期或日期和时间格式。

  • 日期字符向量是表示日期时间的文本,可用于多种格式。例如,日期字符向量支持 'dd-mmm-yyyy HH:MM:SS''dd-mmm-yyyy''mm/dd/yyyy' 文本格式。在处理日期时,通常使用日期字符向量(例如 14-Sep-1999)。

  • 使用 datetime 创建的日期时间数组是表示时间点的最佳数据类型。datetime 值具有灵活的显示格式和纳秒级的精度,并且还可以将时区、夏令时和闰秒纳入考虑范围。当 datetime 对象作为其他 Financial Toolbox 函数的输入时,输入 datetime 对象的格式保持不变。例如:

    originalDate = datetime('now','Format','yyyy-MM-dd HH:mm:ss'); 
      % Find the next business day 
      b = busdate(originalDate)
      
    b = 
    
      datetime
    
       2021-05-04 15:59:34

  • 日期序列值将日历日期表示为自固定基准日期以来经过的天数。在 MATLAB® 软件中,日期序列值 1 表示公元 0000 年 1 月 1 日。Financial Toolbox 可以在内部处理日期序列值(例如,730377)。MATLAB 还可以使用时间序列值来表示不足一天的部分(从午夜开始)。例如,下午 6 点等于 0.75 序列天,因此 14-Sep-1999 的下午 6:00,在 MATLAB 中是日期序列值 730377.75

注意

如果您指定两位数的年份,MATLAB 会将该年份视为以当前年份为中心的 100 年范围内。具体信息请参阅函数 datenum。MATLAB 内部日期处理和计算不会生成具有多义性的值。但是,请尽可能使用包含四位数年份的日期序列值或日期字符向量。

许多需要日期作为输入参量的 Financial Toolbox 函数接受日期字符向量、日期时间数组或日期序列值。如果您在 MATLAB 命令行中处理少数几个日期,则日期字符向量更方便。如果您使用 Financial Toolbox 中的函数处理大量日期,例如在分析大型投资组合或现金流时,如果使用日期时间数组或日期序列值,将有助于提升性能。有关详细信息,请参阅表示 MATLAB 中的日期时间

日期转换

Financial Toolbox 提供了可将日期字符向量与日期序列值进行相互转换的函数。此外,您还可以将字符向量或日期序列值转换为日期时间数组。

用于转换日期格式的函数包括:

datedisp

显示日期条目格式化为日期字符向量的数字矩阵。

datenum

将日期字符向量转换为日期序列值。

datestr

将日期序列值转换为日期字符向量。

datetime

将日期字符向量或日期序列值转换为日期时间数组。

datevec将日期序列值或日期字符向量转换为包含 [Year Month Day Hour Minute Second] 元素的日期向量。
m2xdate

将 MATLAB 日期序列值转换为 Excel® 日期序列值。

x2mdate

将 Microsoft®Excel 日期序列值转换为 MATLAB 日期序列值。

有关详细信息,请参阅Convert Between Text and datetime or duration Values

在日期时间数组和字符向量之间转换

日期可以是由与特定日期时间相关的字段组成的字符向量。可以使用几种文本格式来表示日期时间。例如,以下所有字符向量都表示 2010 年 8 月 23 日下午 04:35:42:

'23-Aug-2010 04:35:06 PM'
'Wednesday, August 23'
'08/23/10 16:35'
'Aug 23 16:35:42.946'

日期字符向量包括用于分隔字段的字符,例如此处使用的连字符、空格和冒号:

d = '23-Aug-2010 16:35:42'	

使用 datetime 函数将一个或多个日期字符向量转换为 datetime 数组。为了获得最佳性能,请将输入字符向量的格式指定为 datetime 的输入。

注意

datetime 用于描述日期时间格式的设定符不同于 datestrdatevecdatenum 函数接受的设定符。

t = datetime(d,'InputFormat','dd-MMM-yyyy HH:mm:ss')
t = 

   23-Aug-2010 16:35:42

日期字符串 ddatetime 标量 t 虽然看起来相似,却并不相等。查看每个变量的大小和数据类型。

whos d t
    Name      Size            Bytes  Class       Attributes

  d         1x20               40  char                  
  t         1x1               121  datetime              

datetime 数组转换为使用 charcellstr 的字符向量。例如,将当前日期时间转换为时间戳以追加到文件名中。

t = datetime('now','Format','yyyy-MM-dd''T''HHmmss')
t = 

  datetime

   2016-12-11T125628
S = char(t);
filename = ['myTest_',S]
filename =

    'myTest_2016-12-11T125628'

将日期序列值转换为日期时间数组

时间序列可以表示从午夜开始的小数天数。例如,下午 6 点等于以序列表示的 0.75 天,因此 MATLAB 中的字符向量 '31-Oct-2003, 6:00 PM' 就是日期数字 731885.75

使用 datetime 函数将一个或多个日期序列值转换为 datetime 数组。指定要转换的日期数字的类型:

t = datetime(731885.75,'ConvertFrom','datenum')
t = 

  datetime

   31-Oct-2003 18:00:00

将日期时间数组转换为数值

一些 MATLAB 函数接受数值数据类型但不接受日期时间值作为输入。要将这些函数应用于日期时间数据,请先将日期时间值转换为有意义的数值,然后调用函数。例如,log 函数接受 double 输入,但不接受 datetime 输入。假设您有一个 datetime 数组,其中的日期跨越了一项研究或试验的整个过程。

t = datetime(2014,6,18) + calmonths(1:4)
t = 

  1×4 datetime array

   18-Jul-2014   18-Aug-2014   18-Sep-2014   18-Oct-2014

减去原点值。例如,原点值可以是试验的开始日期。

dt = t - datetime(2014,7,1)
dt = 

  1×4 duration array

    408:00:00   1152:00:00   1896:00:00   2616:00:00

dt 是一个 duration 数组。分别使用 yearsdayshoursminutesseconds 函数,将 dt 转换为以年、天、小时、分钟或秒为单位的 double 数组。

x = hours(dt)
x =

         408        1152        1896        2616

double 数组作为输入传递给 log 函数。

y = log(x)
y =

    6.0113    7.0493    7.5475    7.8694

使用 datenum 进行输入转换

datenum 函数对于高效使用 Financial Toolbox 软件非常重要。datenum 接受多种格式的输入日期字符向量,其中 'dd-mmm-yyyy''mm/dd/yyyy''dd-mmm-yyyy, hh:mm:ss.ss' 格式是最常见的。输入日期字符向量最多可以有六个由字母和数字(字母和数字之间由任何其他字符分隔)组成的字段,例如:

  • 日期字段的取值范围为 131 之间的整数。

  • 月份字段可以是 112 之间的整数,也可以是至少三个字符的字母字符向量。

  • 年份字段是一个非负整数。如果只指定两个数字,则年份被视为处于以当前年份为中心的 100 年范围内。如果未指定年份,则默认为当前年份。

  • 小时、分钟和秒字段是可选的。它们是用冒号分隔或后跟 'am''pm' 的整数。

例如,如果当前年份是 1999 年,则以下所有日期都是等效的:

'17-May-1999'
'17-May-99'
'17-may'
'May 17, 1999'
'5/17/99'
'5/17'

此外,这两种格式表示的是同一时间。

'17-May-1999, 18:30'
'5/17/99/6:30 pm'

纯数字输入的默认格式遵循美国惯例。因此,3/6 表示 3 月 6 日,而非 6 月 3 日。

使用 datenum,您可以将日期转换为日期序列格式,将它们存储为矩阵变量,然后将该变量传递给函数。或者,您也可以直接在函数输入参量列表中使用 datenum

例如,假定使用 bndprice 函数在给定到期收益率的情况下计算债券价格。首先为到期收益率、息票率和必要日期设置变量。

Yield       = 0.07;
CouponRate  = 0.08;
Settle      = datenum('17-May-2000');
Maturity    = datenum('01-Oct-2000');

然后使用这些变量调用该函数。

bndprice(Yield,CouponRate,Settle,Maturity)
ans =

  100.3503

或者,直接在函数输入参量列表中将日期字符向量转换为日期序列值。

bndprice(0.07,0.08,datenum('17-May-2000'),... 
datenum('01-Oct-2000'))
ans =

  100.3503

bndprice 是一个用于检测是否存在日期字符向量并自动进行转换的函数示例。对于 bndprice 之类的函数,可直接传递日期字符向量。

bndprice(0.07,0.08,'17-May-2000','01-Oct-2000')
ans =

  100.3503

将日期表示为日期字符向量或日期序列值通常是为了方便起见。例如,为可视显示或调试日期处理代码而格式化数据时,您可以更轻松地将日期视为日期字符向量,因为日期序列值难以解释。另外,日期序列值只是另一种数值数据,您可以将其与任何其他数值数据一起放在矩阵中以便于操作。

请记住,如果您创建由输入日期字符向量组成的向量,请使用列向量并确保所有字符向量的长度相同。要确保字符向量的长度相同,请用空格或零填充字符向量。有关详细信息,请参阅字符向量输入

使用 datestr 进行输出转换

datestr 函数将日期序列值转换为显示日期、时间或两者的 19 种不同日期字符向量输出格式之一。日期的默认输出是日-月-年字符向量,例如 24-Aug-2000datestr 函数对于准备输出报告非常有用。

datestr 格式

描述

01-Mar-2000 15:45:17

日-月-年 时:分:秒

01-Mar-2000

日-月-年

03/01/00

月/日/年

Mar

月(三个字母)

M

月(单字母)

3

月份

03/01

月/日

1

日期

Wed

星期几(三个字母)

W

星期几(单字母)

2000

年份(四位数)

99

年份(两位数)

Mar01

月年

15:45:17

时:分:秒

03:45:17 PM

时:分:秒(上午或下午)

15:45

时:分

03:45 PM

时:分(上午或下午)

Q1-99

日历季度-年

Q1

日历季度

当前日期时间

todaynow 函数分别返回当前日期以及当前日期时间的日期序列值。

today
ans =

      736675
now
ans =

   7.3668e+05

MATLAB 函数 date 返回当前日期的字符向量。

date
ans =

    '11-Dec-2016'

确定特定日期

Financial Toolbox 提供了许多用于确定特定日期的函数。例如,假设您在每个月的最后一个星期五安排了一个会计程序。使用 lweekdate 函数返回 2000 年的这些日期。输入参量 6 指定星期五。

Fridates = lweekdate(6,2000,1:12);
Fridays = datestr(Fridates)
Fridays =

  12×11 char array

    '28-Jan-2000'
    '25-Feb-2000'
    '31-Mar-2000'
    '28-Apr-2000'
    '26-May-2000'
    '30-Jun-2000'
    '28-Jul-2000'
    '25-Aug-2000'
    '29-Sep-2000'
    '27-Oct-2000'
    '24-Nov-2000'
    '29-Dec-2000'

另一个需要特定日期的示例可能是您的公司在马丁·路德·金日也就是 1 月的第三个星期一休息。您可以使用 nweekdate 函数来确定从 2011 年到 2014 年的这些特定日期。

MLKDates = nweekdate(3,2,2011:2014,1);
MLKDays = datestr(MLKDates)
MLKDays =

  4×11 char array

    '17-Jan-2011'
    '16-Jan-2012'
    '21-Jan-2013'
    '20-Jan-2014'

确定节假日

在检查金融日期时,考虑节假日和其他非交易日是很重要的。Financial Toolbox 提供了 holidays 函数,其中包含纽约证券交易所从 1950 年到 2030 年(含)的假期和特殊非交易日。此外,您还可以使用 nyseclosures 来计算纽约证交所从 1885 年 1 月 1 日到 2050 年 12 月 31 日期间的所有已知或预期关闭日期。nyseclosures 返回在 StartDateEndDate(含)日期之间与闭市对应的日期序列值向量。

在此示例中,使用 holidays 来确定 2012 年下半年的标准节假日。

LHHDates = holidays('1-Jul-2012','31-Dec-2012');
LHHDays = datestr(LHHDates)
LHHDays =

  6×11 char array

    '04-Jul-2012'
    '03-Sep-2012'
    '29-Oct-2012'
    '30-Oct-2012'
    '22-Nov-2012'
    '25-Dec-2012'

然后,您可以使用 busdate 函数确定 2012 年这些节假日之后的下一个工作日。

LHNextDates = busdate(LHHDates);
LHNextDays = datestr(LHNextDates)
LHNextDays =

  6×11 char array

    '05-Jul-2012'
    '04-Sep-2012'
    '31-Oct-2012'
    '31-Oct-2012'
    '23-Nov-2012'
    '26-Dec-2012'

确定现金流日期

要确定定期定额缴款证券的现金流日期,请使用 cfdates。此函数根据每年息票数、计日基数和月末规则进行计算。例如,您可以使用 actual/365 计日基数,确定每年支付息票四次(月末付息)的证券的现金流日期。为此,请为 PeriodBasisEndMonthRule 输入结算日、债券到期日和参数。

PayDates = cfdates('14-Mar-2000','30-Nov-2001',4,3,1);
PayDays = datestr(PayDates)
PayDays =

  7×11 char array

    '31-May-2000'
    '31-Aug-2000'
    '30-Nov-2000'
    '28-Feb-2001'
    '31-May-2001'
    '31-Aug-2001'
    '30-Nov-2001'

另请参阅

| | | | | | | | | | |

相关示例

详细信息

外部网站