13号星期五和Datetime方法

今天是星期五,13号。在世界上许多地方,今天被视为不幸的.但我想重温一个老问题:就是今天不太可能?每个月的13号是星期五的概率是多少?计算答案使用了一个新的MATLAB®特性,thedatetime方法。

几年前,我在一篇博客中写过关于13号星期五的文章,克利夫角,13号星期五.今天我将重复使用这篇文章的一部分内容。

内容

闰年

闰年使我们的日历成为一个不平凡的数学对象。闰年规则可以通过这个匿名函数实现。

leapyear = @ (y)国防部(y, 4) = = 0 &国防部(y, 100) ~ = 0 |国防部(y, 400) = = 0;

这就是说闰年每四年发生一次,除了不能被400整除的世纪之交。试试几年的数字。

Y = [2018 2020 2000 2100]';Isleap = [y闰年(y)]
Isleap = 2018 0 2020 1 2000 1 2100 0

所以,今年不是闰年,下一个闰年是2020年。世纪之交2000年是闰年,但2100年不是。

日历

闰年规则意味着我们的日历有400年的周期。2000年至2399年的日历将在2400年至2799年重复使用。在400年的时间里,有97个闰年、4800个月、20871个星期和146097天。所以一个日历年的平均天数不是365.25天,而是

日元= 365+97/400
日元= 365.2425

我们可以通过计算在4800个月里出现的次数来计算出一个月的13号是星期五的概率。正确的概率是这个数除以4800。因为4800不是7的倍数,所以概率不会降低到1/7。

Datenum

多年来,涉及日期和时间的计算都是用一大堆函数来完成的。

  • 时钟
  • datenum
  • datevec
  • datestr
  • dateticks
  • 现在
  • 工作日

这些职能对我们很有用,但也有一些明显的缺点。它们不是特别容易使用。显示格式有限。的浮点精度datenum有效地限制持续时间的计算。目前还没有立即退休的计划datenum还有它的朋友,但现在有更好的东西了。

Datetime

datetime在R2014b中引入的object将这些函数组合并扩展为一个。

  • datetime

文档datetime可以在线使用,或者从MATLAB中使用该命令

医生datetime

例如,这是我发表这篇文章的日期和时间。

D =日期时间(“现在”
d = datetime 13-Apr-2018 21:21:19

可以指定自定义显示格式

D =日期时间(D,“格式”'eeee, MMMM d, yyyy HH:mm:ss'
d = datetime 2018年4月13日星期五21:21:19

可用的显示格式包括对国际标准的支持,金宝appISO 8601

纳秒

datetime的精度要比datenum是最理想的。试试这个

HMS = datetime(d,“格式”“HH: mm: ss。瑞士的
HMS = datetime 21:21:19.502

我们看到了d就是将小数秒进到小数点后至少三位。纳秒呢?

Secperday = 24*60*60 nano = 1。E-9 /secperday HMS = datetime(d,“格式”“HH: mm: ss。SSSSSSSSS”) hmsplusnano = HMS + nano
Secperday = 86400 nano = 1.1574e-14 HMS = datetime 21:21:19.502000000 hmsplusnano = datetime 21:21:19.502000001

纳秒比舍入误差小4个数量级datenum在这个时代。比较

eps(datenum(d))
Nano = 1.1574e-14 epsofdatenum = 1.1642e-10

我很高兴透露一些细节的算术datetime.这个物体使用的是四倍精度两双.实际上,112位格式的后半部分存储为虚部数据字段,如下所示。

disp (struct (hmsplusnano))
警告:在对象上调用STRUCT可以防止对象隐藏其实现细节,因此应该避免。使用DISP或DISPLAY查看对象的可见公共细节。更多信息请参见“help struct”。UTCLeapSecsZoneID: 'UTC' UTCLeapSeconds' ISO8601Format: ' uuuuu - mm -dd' t ' hh:mm:ss。瑞士的Z'' epochDN: 719529 MonthsOfYear: [1×1 struct] DaysOfWeek: [1×1 struct] dateFields: [1×1 struct] noConstructorParamsSupplied: [1×1 struct] data: 1.5237e+12 + 1.0000e-06i fmt: 'HH:mm:ss.SSSSSSSSS' tz: '' isDateOnly: 0

预期的

中的摘要描述datetime文档描述了对象的一些重要特性,该对象定义了近100个方法。

datetime数组表示使用ISO日历的时间点。datetime值具有可达纳秒精度的灵活显示格式,并可考虑时区、日光节约时间和闰秒。

我得查一下"有前景的"的定义。在这种情况下,这意味着日历可以在时间上向后扩展,甚至适用于它被采用之前的日期。

Vectorize

让我们从13号星期五开始。就像MATLAB中的大多数东西一样datetime处理向量。的语句

Y = 2000;M = 1:4800;T = 13;V = datetime(y,m,t);

生成一个4800的行向量datetime每个月的13号。前几个和最后几个是

流(' % s 'v(1:4))流(“……\ n”)流(' % s ', v (end-3:结束)
13-Jan-2000 - 13-Feb-2000 - 3- 2000 - 13-Apr-2000…13- sept -2399 13-Oct-2399 13-Nov-2399 13- december -2399

该声明

W =工作日(v);

在1(周日)和7(周六)之间生成4800个弗林特的行向量。前几个和最后几个是

流(“% 3 d”w(1:4))流(“……”)流(“% 3 d”, w (end-3:结束)
5 1 2 5…2 4 7 2

现在要获得工作日的计数,我们只需要

C = histcounts(w)
C = 687 685 685 687 684 688 684

你知道了。周五的死亡人数为688人,比一周中的任何一天都要多。任何一个月的13号都更有可能是周五。

概率是

P = c/4800
P = 0.1431 0.1427 0.1427 0.1431 0.1425 0.1433 0.1425

将这些值与它们的平均值进行比较,1/7 = 0.1429.4个概率低于平均值,3个高于平均值。

分类

让我们将计数与一周中的天数配对,使用分类变量,在R2013b中引入。

C = category (w,1:7,{“太阳”“我的”“星期二”“结婚”“星期四”“星期五”“坐”});总结(c)
星期日、星期一、星期二、星期三、星期四、星期五、星期六687 685 685 687 684 688 684

当我们绘制直方图时,在x轴上提供了适当的标签。13号星期五是赢家。

直方图(c)集(gca,“ylim”,[680 690])标题(“工作日,400年”

谢谢

感谢MathWorks的Peter Perkins。在这个岗位上,我从他身上学到了很多东西。




发布与MATLAB®R2018a

|
  • 打印
  • 发送电子邮件

コメント

コメントを残すには,ここをクリックしてMathWorksアカウントにサインインするか新しいMathWorksアカウントを作成します。