处理和转换日期
日期格式
几乎所有金融数据都来自于时间序列,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 序列日期值。 |
有关详细信息,请参阅在文本与 datetime 或 duration 值之间转换。
在日期时间数组和字符向量之间转换
日期可以是由与特定日期和时间相关的字段组成的字符向量。可以使用几种文本格式来表示日期和时间。例如,以下所有字符向量都表示 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 用于描述日期和时间格式的设定符不同于 datestr、datevec 和 datenum 函数接受的设定符。
t = datetime(d,'InputFormat','dd-MMM-yyyy HH:mm:ss')
t = 23-Aug-2010 16:35:42
日期字符串 d 与 datetime 标量 t 虽然看起来相似,却并不相等。查看每个变量的大小和数据类型。
whos d t
Name Size Bytes Class Attributes d 1x20 40 char t 1x1 121 datetime
将 datetime 数组转换为使用 char 或 cellstr 的字符向量。例如,将当前日期和时间转换为时间戳以追加到文件名中。
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:00dt 是一个 duration 数组。分别使用 years、days、hours、minutes 或 seconds 函数,将 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' 格式是最常见的。输入日期字符向量最多可以有六个由字母和数字(字母和数字之间由任何其他字符分隔)组成的字段,例如:
日期字段的取值范围为
1到31之间的整数。月份字段可以是
1到12之间的整数,也可以是至少三个字符的字母字符向量。年份字段是一个非负整数。如果只指定两个数字,则年份被视为处于以当前年份为中心的 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-2000。datestr 函数对于准备输出报告非常有用。
| 描述 |
|---|---|
| 日-月-年 时:分:秒 |
| 日-月-年 |
| 月/日/年 |
| 月(三个字母) |
| 月(单字母) |
| 月份 |
| 月/日 |
| 日期 |
| 星期几(三个字母) |
| 星期几(单字母) |
| 年份(四位数) |
| 年份(两位数) |
| 月年 |
| 时:分:秒 |
| 时:分:秒(上午或下午) |
| 时:分 |
| 时:分(上午或下午) |
| 日历季度-年 |
| 日历季度 |
当前日期和时间
today 和 now 函数分别返回当前日期以及当前日期和时间的序列日期值。
today
ans =
736675now
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 返回在 StartDate 和 EndDate(含)日期之间与闭市对应的序列日期值向量。
在此示例中,使用 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 计日基数,确定每年支付息票四次(月末付息)的证券的现金流日期。为此,请为 Period、Basis 和 EndMonthRule 输入结算日、债券到期日和参数。
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'
另请参阅
datedisp | datenum | datestr | datetime | datevec | format | date | holidays | nyseclosures | busdate | cfdates | addBusinessCalendar
主题
- 在文本与 datetime 或 duration 值之间转换
- Read Collection or Sequence of Spreadsheet Files
- Trading Calendars User Interface
- UICalendar User Interface
- Convert Dates Between Microsoft Excel and MATLAB (Spreadsheet Link)