处理和转换日期
日期格式
几乎所有金融数据都来自于时间序列,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
用于描述日期时间格式的设定符不同于 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:00
dt
是一个 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 = 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
返回在 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
相关示例
- Convert Between Text and datetime or duration Values
- Read Collection or Sequence of Spreadsheet Files
- Trading Calendars User Interface
- UICalendar User Interface
详细信息
- Convert Dates Between Microsoft Excel and MATLAB (Spreadsheet Link)