主要内容

从外部数据添加事件到时间表

此示例演示如何使用存储在时间表中的带有时间戳的数据的事件。一个事件由时间戳(某件事发生的时间),通常是描述(发生了什么),有时是关于事件的附加信息组成。瞬时事件的时间戳是单个时间点datetime持续时间价值。间隔事件的时间戳由定义事件开始和结束的两个时间点组成。

您可以使用事件来查找或标记感兴趣的数据,以便绘制和分析。这个示例展示了如何使用数据集外部的信息定义数据中的事件。要查找时间戳数据内的事件,请参见在时间戳数据中查找事件

可以将事件与主数据集分开存储。时间表是存储事件的一种方便方法,因为它可以保存事件时间戳及其描述和任何其他信息。可以将事件时间戳用作主数据集的下标,以选择事件发生时、之前或之后或两个事件之间的数据。还可以使用一个或多个附加时间表变量将事件存储在与其描述的数据集相同的时间表中。这个例子展示了如何使用这两种表示。哪种表示更有用取决于您计划执行的数据分析。

使用一天长度的变化定义数据集

根据定义,一天是86,400秒,其中秒在国际单位制(SI)中有精确的定义。然而,一天的长短实际上因一些物理原因而有所不同。由于地球轨道的偏心率和地轴的倾斜,它随着季节的变化而变化,在SI定义下,变化幅度可达30秒,而在SI定义下则为21秒。平均这些季节影响可以定义平均太阳日它的长度在一年之内不会变化。

此外,由于潮汐与月球的相互作用,地球的自转速度会长期减慢;一个较小的、相反的、短期的成分被认为是由于大陆冰原融化造成的;几十年左右的短期周期;以及由于地质事件和其他原因导致的不可预测的波动。由于这些影响,平均太阳日的长度可能增加或减少。近几十年来,它上下波动,但大多比86,400秒长1-3毫秒。这种差异被称为超长日数,或多余的LOD

对于本例,创建一个时间表,其中包含从1962年1月1日到现在每天的多余LOD。的国际地球自转与参考系统服务(IERS)收集并发布这些数据。但是,这些数据在存储到MATLAB时间表之前需要进行预处理,因为日期被修改了朱利安日期.要将IERS数据读入表,请使用readtable函数。将感兴趣的两个变量重命名为MJD而且ExcessLOD

文件=“https://datacenter.iers.org/data/latestVersion/223_EOP_C04_14.62-NOW.IAU1980223.txt”;IERSdata = readtable(文件,“NumHeaderLines”14);IERSdata.Properties。VariableNames([4 8]) = [“MJD”“ExcessLOD”];

若要在时间表中存储多余的LOD值,请将修改后的朱利安日期转换为datetime值。使用datetime函数与“ConvertFrom”、“mjd”名称-值参数。将多余的LOD值转换为持续时间值,使用函数。然后转换IERSdata从表格到时间表使用table2timetable函数。

IERSdata。日期=日期时间(IERSdata. Date =日期时间。MJD,“ConvertFrom”“mjd”);IERSdata。ExcessLOD= seconds(IERSdata.ExcessLOD); IERSdata = table2timetable(IERSdata(:,[“日期”“ExcessLOD”)))
IERSdata =22017×1的时间表日期过量___________ ____________ 01-Jan-1962 0.001723秒- jan -1962 0.001669秒- jan -1962 0.001582秒04-Jan-1962 0.001496秒05-Jan-1962 0.001416秒06-Jan-1962 0.001382秒07-Jan-1962 0.001413秒08-Jan-1962 0.001505秒09-Jan-1962 0.001628秒10-Jan-1962 0.001738秒11-Jan-1962 0.001794秒12-Jan-1962 0.001774秒13-Jan-1962 0.001667秒14-Jan-1962 0.001312秒16-Jan-1962 0.001312秒

将多余的LOD绘制成时间的函数。过剩LOD目前平均在减少,但除了非常短暂的时期外,一直保持正值。

情节(IERSdata.Date IERSdata.ExcessLOD,“b -”);ylabel (“超额LOD”);

图中包含一个轴对象。axis对象包含一个line类型的对象。

计算一天的累计多余长度

一个将一天定义为86,400国际单位秒的时钟相对于地球自转有效地运行得很快,相对于太阳每天获得时间。每天多出的几毫秒似乎不重要,但自1962年以来,额外的LOD累积起来。

将累积的多余LOD添加到IERSdata作为另一个表变量。若要计算多余LOD的累积和,请使用cumsum函数。然后使用stackedplot函数将多余LOD和累积多余LOD绘制在一起。这张图显示,自20世纪60年代以来,由于累积的过量LOD而造成的转移不到一分钟。

IERSdata。累积elod = [0;cumsum (IERSdata.ExcessLOD (1: end-1)];h = stackkedplot (IERSdata,[“ExcessLOD”“CumulativeELOD”])

图中包含一个类型为stackedplot的对象。

h = stackkedlinechart with properties: SourceTable: [22017×2时间表]DisplayVariables: {'ExcessLOD' 'CumulativeELOD'}颜色:[0 0.4470 0.7410]LineStyle: '-' LineWidth: 0.5000 Marker: 'none' MarkerSize: 6显示所有属性

将闰秒定义为单独时间表中的事件

1972年1月1日午夜时分,现行版本的时间系统被称为协调世界时(UTC),每天使用86,400国际标准秒。在这一天,UTC被定义为与格林威治子午线上的太阳时间大致同步,或者更准确地说,与UT1时间同步。然而,由于累积了过多的LOD,基于每天86,400 SI秒的计时将偏离我们对太阳时的物理体验。所以当需要的时候,一个额外的闰秒调整插入是为了使UTC时间与太阳时间大致同步。如果在1972年之后没有这些闰秒调整,累积的过量LOD将导致UTC多年来偏离UT1。在几十年内,差距将扩大到几十秒。

显示自1972年以来的差异。首先,通过下标选择1971年以后的多余LOD数据IERSdata时间范围从1972年1月1日开始要创建该时间范围,请使用timerange函数。

IERSdata1972 = IERSdata(时间范围(“1972-01-01”正)“ExcessLOD”
IERSdata1972 =18365×1的时间表日期ExcessLOD ___________ ____________ 01-Jan-1972 0.002539秒02-Jan-1972 0.002708秒03-Jan-1972 0.002897秒04-Jan-1972 0.003065秒05-Jan-1972 0.003177秒06-Jan-1972 0.00322秒07-Jan-1972 0.003201秒08-Jan-1972 0.003137秒09-Jan-1972 0.003033秒10-Jan-1972 0.002898秒11-Jan-1972 0.002672秒12-Jan-1972 0.002672秒14-Jan-1972 0.002642秒15-Jan-1972 0.00274秒16-Jan-1972 0.002937秒

加上另一个自1972年以来未经调整的差异变量。从1972年1月1日的累积过量LOD开始,它是0.0454859秒。对于接下来的每个日期,计算未调整的差额。到2017年初,未经调整的差距将扩大到约26秒。显示IERSdata1972使用的时间范围包括2017年初。

DiffUT1_1972 = seconds(0.0454859);IERSdata1972。unadjustddiff = DiffUT1_1972 + [0;cumsum (IERSdata1972.ExcessLOD (1: end-1)];IERSdata1972 (timerange (“2016-12-29”“2017-01-04”):)
ans =6×2时间表日期未调整差异___________ _____________ ______________ 29-Dec-2016 0.0008055秒26.402秒30-Dec-2016 0.0008525秒26.402秒31-Dec-2016 0.0009173秒26.403秒01-Jan-2017 0.001016秒26.404秒02-Jan-2017 0.0011845秒26.405秒03-Jan-2017 0.0013554秒26.406秒

这种漂移正是闰秒设计的目的。您可以将插入到UTC时间轴中的每个闰秒视为一个事件。这些事件不是LOD数据的一部分。然而,leapseconds函数列出了自1972年以来发生的每一个闰秒事件。(闰秒事件由leapseconds来自IERS提供的另一组数据。)发回的时间表leapseconds包含时间戳、每个事件的描述(+对于闰秒插入,-对于删除),以及到该事件为止并包括该事件在内的累计闰秒数。到目前为止,所有的闰秒事件都是插入。

lsEvents = leapseconds()
lsEvents =27×2时间表日期类型累积调整_______________ ____________________ 30- june -1972 + 1秒31- 12 -1972 + 2秒31- 12 -1973 + 3秒31- 12 -1974 + 4秒31- 12 -1975 + 5秒31- 12 -1976 + 6秒31- 12 -1978 + 8秒31- 12 -1979 + 9秒30- 6 -1981 + 10秒30- 6 -1982 + 11秒30- 6 -1985 + 13秒31- 12 -1987 + 14秒31- 12 -1989 + 15秒31- 12 -1990 + 16秒

此时,主LOD数据在IERSdata1972时间表。闰秒项目在lsEvents时间表。

使用事件时间戳选择数据

将每个日期的未调整差异或累积多余LOD添加到lsEvents.要找到这些日期未经调整的差异,请将索引到UnadjustedDiff变量的IERSdata1972并选择时间戳处未调整的差值lsEvents.然后将这些差异附加到中的每个事件lsEvents作为事件的附加信息。

lsEvents。UnadjustedDiff = IERSdata1972.UnadjustedDiff(l7ents . date)
lsEvents =27×3的时间表日期类型CumulativeAdjustment UnadjustedDiff  ___________ ____ ____________________ ______________ 截止1972年6月30 + 1秒0.63494秒31 - 12月- 1972 + 2秒1.1864秒31 - 12月- 1973 + 3秒2.2976秒31 - 12月- 1974 + 4秒3.289秒31 - 12月- 1975 + 5秒4.2718秒31 - 12月- 1976 + 6秒5.3334秒31 - 12月- 1977 + 7秒6.3469秒31 - 12月- 1978 + 8秒7.398秒31 - 12月- 1979 + 9秒8.3526秒30 - 1981年6月- 30 + 10秒9.6281秒- jun - 1982 + 11秒10.389秒30 - 1983年6月,+ 12秒11.249秒30 - 1985年6月- 12.451 + 13秒sec 31-Dec-1987 + 14 sec 13.634 sec 31-Dec-1989 + 15 sec 14.669 sec 31-Dec-1990 + 16 sec 15.379 sec ⋮

根据数据绘制事件

lsEvents时间表显示,在每个事件中,每当额外的LOD累积大约一秒,IERS就插入一个闰秒。为了直观地确认这一观察结果,将瞬时闰秒事件绘制为随时间叠加在LOD数据上的点。

情节(IERSdata1972.Date IERSdata1972.UnadjustedDiff);持有情节(lsEvents.Date IERSdata1972.UnadjustedDiff (lsEvents.Date),“r +”);持有

图中包含一个轴对象。axis对象包含2个line类型的对象。

在附加时间表变量中表示事件

每个闰秒都是发生在特定时间的瞬时事件。另一种表示它们的方法是状态变量附在原始LOD数据后。状态变量描述了在数据中的每个时间点所测量的过程的“状态”,而不是标记特定的时刻。这个闰秒数据的一个可能的状态变量是一个指示器变量,它记录每个事件日期的调整,而所有其他日期的值都是缺失的。中的状态变量赋值闰秒事件类型IERSdata1972,使用来自的时间戳lsEvents将事件类型分配给正确的行。此方法有效,因为所有时间戳都来自lsEvents时间戳也在吗IERSdata1972.赋值自动填充new的其他元素调整缺少值的变量。

IERSdata1972.Adjustment(lsevens . date) = lsevens . type;IERSdata1972 (timerange (“2016-12-29”“2017-01-04”):)
ans =6×3的时间表日期ExcessLOD未调整差异调整___________ _____________ ______________ ___________ 29-Dec-2016 0.0008055秒26.402秒 30-Dec-2016 0.0008525秒26.402秒 31-Dec-2016 0.0009173秒26.403秒+ 01- january -2017 0.001016秒26.404秒 02- january -2017 0.0011845秒26.405秒 03- january -2017 0.0013554秒26.406秒

另一种可能(在本例中更有用)是添加一个状态变量,该状态变量指示LOD数据中任何给定日期的闰秒累积和。闰秒发生在一天结束时,因此首先为每个事件的日期后一天分配一个1秒的值。

IERSdata1972。调整= [];移除前一个状态变量IERSdata1972.Adjustment(l7its . date +caldays(1)) = seconds(1);IERSdata1972 (timerange (“2016-12-29”“2017-01-04”):)
ans =6×3的时间表日期未调整差异调整___________ _____________ ______________ __________ 2016年12月29日- 12月0.0008055秒26.402秒0秒30- 12月-2016年12月31日-2016年12月0.0008525秒26.402秒0秒01- 2017年1月0.001016秒26.404秒1秒02- 2017年1月0.0011845秒26.405秒0秒03- 2017年1月0.0013554秒26.406秒0秒

然后使用累积和来填写调整状态变量在数据中的其他时间。而不是包含的值+而且<定义>,状态变量调整的每一行中所列日期时添加的闰秒数IERSdata1972

IERSdata1972。调整= cumsum(IERSdata1972.Adjustment); IERSdata1972(timerange(“2016-12-29”“2017-01-04”):)
ans =6×3的时间表日期未调整差异调整___________ _____________ ______________ __________ 2016年12月29日- 12月0.0008055秒26.402秒26秒30- 12月-2016年12月31日-2016年12月0.0008525秒26.402秒26秒01- 2017年1月0.001016秒26.404秒27秒02- 2017年1月0.0011845秒26.405秒27秒03- 2017年1月0.0013554秒26.406秒27秒

虽然这里没有使用调整时间函数通常是将瞬时事件转换为状态变量的有用工具。

当新的状态变量表示瞬时事件时,它就像所有其他变量一样IERSdata1972,并在每次定义一个值。您可以使用它来计算UTC和UT1之间的实际差异,给定所有的闰秒调整,通过从未调整的差异中减去它。惯例是计算与相反符号UT1 - UTC的实际差值,并将其表示为DUT1。

IERSdata1972。DUT1= IERSdata1972.UnadjustedDiff - IERSdata1972.Adjustment; IERSdata1972(timerange(“2016-12-29”“2017-01-04”):)
ans =6×4时间表日期未调整的差异调整DUT1 ___________ _____________ ______________ __________ ____________ 29-Dec-2016 0.0008055秒26.402秒26秒0.40159秒30-Dec-2016 0.0008525秒26.402秒26秒0.40239秒31-Dec-2016 0.0009173秒26.403秒26秒0.40324秒01-Jan-2017 0.001016秒26.404秒27秒-0.59584秒02-Jan-2017 0.0011845秒26.405秒27秒-0.59482秒03-Jan-2017 0.0013554秒26.406秒27秒-0.59364秒

根据数据绘制状态变量图

IERS进行闰秒调整,使UTC与UT1大致同步。为了显示这种调整是如何工作的,绘制调整状态变量是分段常数阶跃函数。阶跃函数近似于累积的多余LOD,因此减去它使DUT1保持较小。为直观确认,使用stackedplot函数。情节UnadjustedDiff而且调整一起沿着一条y-轴,带有传说和情节DUT1稍等一下y设在。

h = stackkedplot (IERSdata1972,{[“UnadjustedDiff”“调整”),“DUT1”})

图中包含一个类型为stackedplot的对象。

h = stackkedlinechart with properties: SourceTable: [18365×4时间表]DisplayVariables: {{1×2 cell} 'DUT1'}颜色:[0 0.4470 0.7410]LineStyle: '-' LineWidth: 0.5000 Marker: 'none' MarkerSize: 6显示所有属性

将DUT1在每个闰秒之前和之后的值添加到lsEvents.要获得这些值,请使用闰秒事件的瞬时形式。索引到DUT1变量的IERSdata1972使用的时间戳lsEvents.得到的价值DUT1在那天加上每一闰秒,在之后一天的日期加上。一般来说,DUT1在添加闰秒后的第二天有一个小的负值。

lsEvents。unadjustddiff = [];删除前面的附加事件信息lsEvents。DUT1_before = IERSdata1972.DUT1(lsEvents.Date); lsEvents.DUT1_after = IERSdata1972.DUT1(lsEvents.Date+caldays(1))
lsEvents =27×4时间表日期类型CumulativeAdjustment DUT1_before DUT1_after  ___________ ____ ____________________ ___________ ____________ 截止1972年6月30 + 1秒-0.36236 0.63494秒秒31 - 12月- 1972 + 2秒-0.8107 0.18641秒秒31 - 12月- 1973 + 3秒-0.69952 0.29763秒秒31 - 12月- 1974 + 4秒-0.70817 0.28898秒秒31 - 12月- 1975 + 5秒-0.72578 0.2718秒秒31 - 12月- 1976 + 6秒-0.66411 0.33338秒秒31 - 12月- 1977 + 7秒-0.64986 0.34693秒秒31 - 12月- 1978 + 8秒-0.59892 0.39802秒秒31 - 12月- 1979 + 9秒0.35261秒-0.64508秒- 31- 12 -1989 + 14秒0.63443秒-0.36417秒31- 12 -1989 + 15秒0.66947秒-0.32879秒31- 12 -1990 + 16秒0.37936秒-0.61885秒

选择事件或状态变量

这两种表示形式(瞬时事件的单独列表和时刻定义的状态变量)在概念上是不同的。在某些情况下,可能没有一个有用的“状态”定义来对应瞬时事件之间的周期。但当存在时,这两种表示方式是等价的,并且以类似的方式有用。例如,要选择第22闰秒之后但第23闰秒之前的所有数据,可以使用事件时间和timerange

from22to23 = timerrange (lseventy . date (22), lseventy . date (23),“openleft”);data22to23 = IERSdata1972(from22to23,:)
data22to23 =2557×4时间表DUT1 ___________ _____________ ______________ __________ ____________ 01- 01- 1999年1月0.0009738秒21.283秒22秒-0.71702秒02- 1999年1月0.000888秒21.284秒22秒-0.71604秒03- 1999年1月0.0008605秒21.285秒22秒-0.71516秒04- 1999年1月0.0008798秒21.286秒22秒-0.71429秒05- 1999年1月0.0008935秒21.287秒22秒-0.71342秒06- 1999年1月0.0009693秒21.287秒22秒-0.71252秒07- 1999年1月0.0010658秒21.288秒22秒-0.71155秒08- 1- 1999年1月0.0010857秒21.29秒22秒-0.71049秒09- 1999年1月0.0010715秒21.291秒22秒-0.7094秒1999年1月11日0.0010519秒21.292秒22秒-0.70833秒12- 1999年1月0.0008986秒21.294秒22秒-0.70628秒13- 1999年1月0.0007891秒21.295秒22秒-0.70538秒14- 1999年1月0.0007236秒21.295秒22秒-0.70459秒15- 1999年1月0.0006842秒21.296秒22秒-0.70386秒21.297年1月16日0.0006091秒SEC 22 SEC -0.70318 SEC `

作为一种替代方法,您可以从选择相同数据的状态变量创建一个逻辑下标。

from22to23 = (IERSdata1972。调整== seconds(22)); data22to23 = IERSdata1972(from22to23,:)
data22to23 =2557×4时间表DUT1 ___________ _____________ ______________ __________ ____________ 01- 01- 1999年1月0.0009738秒21.283秒22秒-0.71702秒02- 1999年1月0.000888秒21.284秒22秒-0.71604秒03- 1999年1月0.0008605秒21.285秒22秒-0.71516秒04- 1999年1月0.0008798秒21.286秒22秒-0.71429秒05- 1999年1月0.0008935秒21.287秒22秒-0.71342秒06- 1999年1月0.0009693秒21.287秒22秒-0.71252秒07- 1999年1月0.0010658秒21.288秒22秒-0.71155秒08- 1- 1999年1月0.0010857秒21.29秒22秒-0.71049秒09- 1999年1月0.0010715秒21.291秒22秒-0.7094秒1999年1月11日0.0010519秒21.292秒22秒-0.70833秒12- 1999年1月0.0008986秒21.294秒22秒-0.70628秒13- 1999年1月0.0007891秒21.295秒22秒-0.70538秒14- 1999年1月0.0007236秒21.295秒22秒-0.70459秒15- 1999年1月0.0006842秒21.296秒22秒-0.70386秒21.297年1月16日0.0006091秒SEC 22 SEC -0.70318 SEC `

两种表示方式都有各自的用途。例如,虽然每个事件都可以绘制为一个点,但状态变量是在图中突出显示事件之间区域的更方便的形式。要突出显示第22闰秒和第23闰秒之间的区域,请使用isbetween函数与调整状态变量为IERSdata1972

情节(IERSdata1972.Date IERSdata1972.UnadjustedDiff);持有from22to23 = isbetween(IERSdata1972.Adjustment,seconds(22),seconds(23));情节(IERSdata1972.Date (from22to23) IERSdata1972.UnadjustedDiff (from22to23),“r -”“线宽”4);持有

图中包含一个轴对象。axis对象包含2个line类型的对象。

您可以在这两种表示方式之间进行切换。在本例中,要从调整状态变量中获得闰秒事件日期,请找到调整发生变化的位置,并减去一天。的eventTimes输出表示添加闰秒的日期,这些日期是瞬时事件。

eventTimes = IERSdata1972.Date(diff(IERSdata1972.Adjustment) ~= 0) - caldays(1)
eventTimes =27×1 datetime1972年6月29日- 12月-1972年30- 12月-1973年30- 12月-1975年30- 12月-1976年30- 12月-1978年30- 12月-1979年29- 6月-1981年29- 6月-1982年29- 6月-1985年30- 12月-1987年30- 12月-1990年30- 12月-1992年29- 6月-1993年29- 6月-1994年30- 12月-1995年29- 6月-1998年30- 12月-2005年30- 12月-2008年29- 6月-2012年29- 6月-2016年30- 12月

是使用瞬时事件、状态变量,还是在它们之间切换,取决于哪一种表示方式对计划执行的数据分析更方便、更有用。这两种表示都是向时间表中的时间戳数据添加事件信息的有用方法。

另请参阅

|||||||||

相关的话题