燕翎天下 發表於 2022-3-4 11:05:48

R语言日期时间的使用

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>1.日期和日期时间类型</li><li>2.从字符串生成日期数据</li><li>3.日期显示格式</li><li>4.访问日期时间的组成值</li><li>5.日期舍入计算</li><li>6.日期计算</li><ul class="second_class_ul"><li>&nbsp;6.1&nbsp;时间长度 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;6.2&nbsp;时间周期</li><li>&nbsp;6.3&nbsp;时间区间</li></ul><li>7.基本 R 软件的日期功能</li><ul class="second_class_ul"><li>7.1&nbsp;生成日期和日期时间型数据</li><li>7.2&nbsp;取出日期时间的组成值</li><li>7.3&nbsp;&nbsp;日期计算</li></ul><li>练习</li><ul class="second_class_ul"></ul></ul></div><p class="maodian"></p><h2>1.日期和日期时间类型</h2>
<p>&nbsp; &nbsp; &nbsp; &nbsp;R 中日期可以保存为 Date 类型,一般用整数保存,数值为从 1970-1-1 经过的天数。</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; R 中用一种叫做 POSIXct 和 POSIXlt 的特殊数据类型保存日期和时间,可以仅包含日期部分,也可以同时有日期和时间。技术上,POSIXct 把日期时间保存为从 1970 年 1 月 1 日零时到该日期时间的时间间隔秒数,所以数据框中需要保存日期时用 POSIXct 比较合适,需要显示时再转换成字符串形式;POSIXlt 把日期时间保存为一个包含年、月、日、星期、时、分、秒等成分的列表,所以求这些成分可以从 POSIXlt 格式日期的列表变量中获得。日期时间会涉及到所在时区、夏时制等问题,比较复杂。</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 基础的 R 用 as.Date()、as.POSIXct() 等函数生成日期型和日期时间型,R 扩展包 lubridate 提供了多个方便函数,可以更容易地生成、转换、管理日期型和日期时间型数据。<br />载入扩展包的方式:</p>
<p><strong>载入扩展包的方式:</strong></p>
<div class="jb51code"><pre class="brush:plain;">library(lubridate)</pre></div>
<p>如果下面内容:</p>
<p style="text-align:center"><img alt="" height="29" src="https://img.jbzj.com/file_images/article/202203/20220304104657123.png" width="758" /></p>
<p>证明你没有安装此扩展包</p>
<p>此时需要安装扩展包,安装方式如下:</p>
<p>点击<strong>【程序包】</strong>,再点击<strong>【安装程序包】</strong></p>
<p style="text-align:center"><img alt="" height="296" src="https://img.jbzj.com/file_images/article/202203/20220304104658124.png" width="433" /></p>
<p>然后,找到 <strong>China(Beijing 2)</strong></p>
<p style="text-align:center"><img alt="" height="237" src="https://img.jbzj.com/file_images/article/202203/20220304104658125.png" width="404" /></p>
<p>然后找到需要安装的<strong>扩展包</strong>&nbsp;<strong>lubridate&nbsp;</strong></p>
<p style="text-align:center"><img alt="" height="204" src="https://img.jbzj.com/file_images/article/202203/20220304104658126.png" width="409" /></p>
<p>&nbsp;然后,点击<strong>【确定】</strong>即可,安装完成会出现如下内容</p>
<p style="text-align:center"><img alt="" height="449" src="https://img.jbzj.com/file_images/article/202203/20220304104658127.png" width="794" /></p>
<p>这次我们再此载入<strong>扩展包</strong>&nbsp;<strong>lubridate&nbsp;</strong></p>
<p style="text-align:center"><img alt="" height="141" src="https://img.jbzj.com/file_images/article/202203/20220304104658128.png" width="750" /></p>
<p class="maodian"></p><h2>2.从字符串生成日期数据</h2>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;函数<strong> lubridate::today() </strong>返回<strong>当前日期</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">today()</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="27" src="https://img.jbzj.com/file_images/article/202203/20220304104658129.png" width="648" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;函数 <strong>lubridate::now() </strong>返回<strong>当前日期时间</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">now()</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="22" src="https://img.jbzj.com/file_images/article/202203/20220304104659130.png" width="503" /></p>
<p>在结果中,我们看到了 CST 字样,<strong>CST 是时区</strong>,这里使用了操作系统提供的当前时区。CST 不是一个含义清晰的时区,在不同国家对应不同的时区,<strong>在中国代表中国标准时间</strong>(北京时间)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用 <strong>lubridate::ymd()</strong>, <strong>lubridate::mdy()</strong>, <strong>lubridate::dmy() </strong>将<strong>字符型向量转换为日期型向量</strong>,但是他们的输入方式不相同,<strong>y</strong> 表示<strong>年</strong>,<strong>m</strong> 表示<strong>月</strong>,<strong>d </strong>表示<strong>日</strong>,如: <strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;年 - 月 - 日</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">ymd(c("2022-1-24","2022-01-24"))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/20220304104659131.png" width="506" /></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;月 - 日 - 年</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">mdy(c("1-24-2022", "01-24-2022"))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/20220304104659131.png" width="506" /></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;日 - 月 - 年</strong>:&nbsp;</p>
<div class="jb51code"><pre class="brush:plain;">dmy(c("24-1-2022","24-01-2022"))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/20220304104659131.png" width="506" /></p>
<p>如果在<strong>年号</strong>只有<strong>两位数字</strong>时,默认对应到 <strong>1969-2068</strong> 范围。</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lubridate::make_date(year, month, day)</strong> 可以从三个数值构成<strong>日期向量</strong>。如</p>
<div class="jb51code"><pre class="brush:plain;">make_date(2022, 1, 24)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="23" src="https://img.jbzj.com/file_images/article/202203/20220304104659132.png" width="453" /></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lubridate</strong> 包的 <strong>ymd、mdy、dmy</strong> 等函数<strong>添加 hms、hm、h</strong> 等后缀,可以用于将<strong>字符串转换成日期时间</strong>。如</p>
<div class="jb51code"><pre class="brush:plain;">ymd_hms("2022-1-24 19:26:35")</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="21" src="https://img.jbzj.com/file_images/article/202203/20220304104700133.png" width="536" /></p>
<p>结果显示中 <strong>UTC 是时区</strong>,UTC 是协调世界时 (Universal Time Coordinated) 英文缩写,是由国际无线电咨询委员会规定和推荐, 并由国际时间局 (BIH) 负责保持的以秒为基础的时间标度。UTC 相当于本初子午线 (即经度 0 度) 上的平均太阳时,过去曾用格林威治平均时 (GMT) 来表示. <strong>北京时间比 UTC 时间早 8 小时</strong>,以 1999 年 1 月 1 日 0000UTC 为例,UTC 时间是零点,北京时间为 1999 年 1 月 1 日早上 8 点整。</p>
<p>在 <strong>Date()</strong>、<strong>as.DateTime()</strong>、<strong>ymd()</strong> 等函数中,可以用<strong> tz= 指定时区</strong>,比如北京时间可指定为 tz=&quot;Etc/GMT+8&quot; 或 tz=&quot;Asia/Shanghai&quot;。</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lubridate::make_datetime(year, month, day, hour, min, sec)</strong> 可以从最多六个数值组成日期时间,其中<strong>时分秒缺省值都是 0</strong>。如</p>
<div class="jb51code"><pre class="brush:plain;">make_datetime(2022, 1, 24, 19, 32, 36)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/20220304104700134.png" width="537" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用 <strong>lubridate::as_date()</strong> 可以将日期时间型转换为日期型,如</p>
<div class="jb51code"><pre class="brush:plain;">as_date(as.POSIXct("2022-01-24 19:32:36"))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="23" src="https://img.jbzj.com/file_images/article/202203/20220304104700135.png" width="415" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用 <strong>lubridate::as_datetime()</strong> 可以将<strong>日期型数据转换为日期时间型</strong>,如</p>
<div class="jb51code"><pre class="brush:plain;">as_datetime(as.Date("2022-01-24"))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="20" src="https://img.jbzj.com/file_images/article/202203/20220304104700136.png" width="479" /></p>
<p class="maodian"></p><h2>3.日期显示格式</h2>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用 <strong>as.character()</strong> 函数把<strong>日期型数据转换为字符型</strong>, 如</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- as.POSIXct(c('2022-1-24', '2022-01-24'))
as.character(x)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="23" src="https://img.jbzj.com/file_images/article/202203/20220304104700137.png" width="540" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在 <strong>as.character()</strong> 中可以用 <strong>format 选项指定显示格式</strong>,格式中 &ldquo;<strong>%Y</strong>&rdquo; 代表四位的公元年号,&ldquo;<strong>%m</strong>&rdquo; 代表两位的月份数字,&ldquo;<strong>%d</strong>&rdquo; 代表两位的月内日期号</p>
<p>如&nbsp;<strong>%m/%d/%Y </strong>表示 <strong>月-日-年</strong></p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- as.POSIXct(c('2022-1-24', '2022-01-24'))
as.character(x, format='%m/%d/%Y')</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="27" src="https://img.jbzj.com/file_images/article/202203/20220304104700138.png" width="479" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;<strong>15Mar98</strong>&quot; 这样的日期在英文环境中比较常见,但是在 R 中的处理比较复杂。在下面的例子中,R <strong>日期被转换成了类似&quot;Mar98&quot;</strong> 这样的格式,在 <strong>format</strong> 选项中用了 &ldquo;<strong>%b</strong>&rdquo; 代表三英文字母月份缩写,但是因为月份缩写依赖于操作系统默认语言环境,需要用 <strong>Sys.setlocale() 函数设置语言环境为&quot;C&quot;</strong>。示例程序如下</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- as.POSIXct(c('2022-1-24', '2022-01-24'))
old.lctime &lt;- Sys.getlocale('LC_TIME')
Sys.setlocale('LC_TIME', 'C')</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="22" src="https://img.jbzj.com/file_images/article/202203/20220304104700139.png" width="387" /></p>
<div class="jb51code"><pre class="brush:plain;">as.character(x, format='%b%y')</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304104700140.png" width="439" /></p>
<div class="jb51code"><pre class="brush:plain;">Sys.setlocale('LC_TIME', old.lctime)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/20220304104700141.png" width="548" /></p>
<p>&nbsp;包含<strong>时间的转换,</strong>如</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- as.POSIXct('2022-1-24 19:56:42')
as.character(x)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/20220304104700142.png" width="533" /></p>
<div class="jb51code"><pre class="brush:plain;">as.character(x, format='%H:%M:%S')</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="24" src="https://img.jbzj.com/file_images/article/202203/20220304104702143.png" width="427" /></p>
<p>这里 &ldquo;<strong>%H</strong>&rdquo; 代表小时(按 24 小时制),&ldquo;<strong>%M</strong>&rdquo; 代表两位的分钟数字,&ldquo;<strong>%S</strong>&rdquo; 代表两位的秒数。</p>
<p class="maodian"></p><h2>4.访问日期时间的组成值</h2>
<p><strong>lubridate</strong> 包的如下函数可以取出日期型或日期时间型数据中的组成部分:</p>
<ul><li>year() 取出年</li><li>month() 取出月份数值</li><li>mday() 取出日数值</li><li>yday() 取出日期在一年中的序号,元旦为 1</li><li>wday() 取出日期在一个星期内的序号,但是一个星期从星期天开始,星期天为 1, 星期一为 2,星期六为 7。</li><li>hour() 取出小时</li><li>minute() 取出分钟</li><li>second() 取出秒</li></ul>
<p>比如, <strong>2022-1-24&nbsp;是星期一</strong>,则 <strong>提取月份</strong></p>
<div class="jb51code"><pre class="brush:plain;">month(as.POSIXct("2022-1-24 19:56:42"))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/20220304104702144.png" width="408" /></p>
<p><strong>提取日</strong></p>
<div class="jb51code"><pre class="brush:plain;">mday(as.POSIXct("2022-1-24 19:56:42"))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/20220304104702145.png" width="389" /></p>
<p><strong>提取</strong>日期在一个星期内的序号</p>
<div class="jb51code"><pre class="brush:plain;">wday(as.POSIXct("2022-1-24 19:56:42"))</pre></div>
<p><strong>lubridate</strong> 的这些成分函数还允许<strong>被赋值</strong>,结果就<strong>修改</strong>了相应元素的值,如 <strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将年份由 2022 赋值为 2000</strong></p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- as.POSIXct("2022-1-24 20:08:15")
year(x) &lt;- 2000
month(x) &lt;- 1
mday(x) &lt;- 1
x</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/20220304104702146.png" width="469" /></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update()</strong> 可以对一个日期或一个日期型<strong>向量统一修改</strong>其组成部分的值,如</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- as.POSIXct("2022-1-24 20:08:15")
y &lt;- update(x, year=2000)
y</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="22" src="https://img.jbzj.com/file_images/article/202203/20220304104702147.png" width="484" /></p>
<p><strong>update() </strong>函数中可以用 <strong>year, month, mday, hour, minute, second</strong> 等参数修改日期的组成部分。</p>
<p class="maodian"></p><h2>5.日期舍入计算</h2>
<p><strong>lubridate</strong> 包提供了 floor_date(), round_date(), ceiling_date() 等函数,对日期可以用 unit= 指定一个时间单位进行舍入。时间单位为字符串,如 seconds, 5 seconds, minutes, 2 minutes, hours, days, weeks, months, years 等。</p>
<p><strong>比如</strong>,以 10 minutes 为单位,<strong>floor_date() </strong>将时间<strong>向前</strong>归一化到 10 分钟的整数倍:</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- ymd_hms("2022-1-24 20:08:15")
floor_date(x, unit="10 minutes")</pre></div>
<p>返回:</p>
<p>&nbsp;</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304104702148.png" width="441" /></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ceiling_date()</strong> 将时间<strong>向后</strong>归一化到 10 分钟的整数倍:</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- ymd_hms("2022-1-24 20:08:15")
ceiling_date(x, unit="10 minutes")</pre></div>
<p>返回:&nbsp;</p>
<p style="text-align:center"><img alt="" height="28" src="https://img.jbzj.com/file_images/article/202203/20220304104702149.png" width="497" /></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;round_date()</strong> 将时间归一化到<strong>最近</strong>的 10 分钟的整数倍,时间恰好是 5 分钟倍数时按照类似四舍五入的原则向上取整。例如</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- ymd_hms("2022-1-24 20:08:15")
round_date(x, unit="10 minutes")</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="28" src="https://img.jbzj.com/file_images/article/202203/20220304104702149.png" width="497" /></p>
<p>如果<strong>单位是星期</strong>,会涉及到一个星期周期的开始是星期日还是星期一的问题。用参数<strong>week_start=7 指定开始是星期日</strong>,<strong>week_start=1 指定开始是星期一</strong>。 &nbsp;</p>
<p class="maodian"></p><h2>6.日期计算</h2>
<p>在<strong> </strong><strong>lubridate</strong> 的支持下<strong>日期可以相减,可以进行加法、除法</strong>。lubridate 包提供了如下的三种与时间长短有关的数据类型:</p>
<ul><li>时间长度 (duration),按整秒计算</li><li>时间周期 (period),如日、周</li><li>时间区间 (interval),包括一个开始时间和一个结束时间</li></ul>
<p class="maodian"></p><h3>&nbsp;6.1&nbsp;时间长度 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</h3>
<p>R 的 <strong>POSIXct </strong>日期时间之间可以相减,如</p>
<div class="jb51code"><pre class="brush:py;">d1 &lt;- ymd_hms("2022-01-24 0:0:0")
d2 &lt;- ymd_hms("2022-01-24 12:0:5")
di &lt;- d2 - d1; di</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="23" src="https://img.jbzj.com/file_images/article/202203/20220304104702150.png" width="516" /></p>
<p>结果显示与日期之间差别大小有关系,结果是类型是 <strong>difftime</strong>。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp;lubridate</strong> 包提供了 <strong>duration</strong> 类型,处理更方便:</p>
<div class="jb51code"><pre class="brush:plain;">as.duration(di)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="27" src="https://img.jbzj.com/file_images/article/202203/20220304104702151.png" width="578" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>lubridate</strong> 的 <strong>dseconds(), dminutes(), dhours(), ddays(), dweeks(), dyears()</strong> 函数可以<strong>直接生成时间长度类型的数据</strong>,如</p>
<div class="jb51code"><pre class="brush:plain;">dhours(1)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="23" src="https://img.jbzj.com/file_images/article/202203/20220304104703152.png" width="491" /></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lubridate</strong> 的时间长度类型总是<strong>以秒作为单位</strong>,可以在时间长度之间<strong>相加</strong>,也可以对时间长度<strong>乘以无量纲数</strong>,如</p>
<div class="jb51code"><pre class="brush:plain;">dhours(1) + dseconds(5)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="30" src="https://img.jbzj.com/file_images/article/202203/20220304104704153.png" width="471" /></p>
<div class="jb51code"><pre class="brush:plain;">dhours(1)*10</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="30" src="https://img.jbzj.com/file_images/article/202203/20220304104704154.png" width="451" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以给一个<strong>日期加或者减去一个时间长度</strong>,结果严格数按推移的秒计算,如</p>
<div class="jb51code"><pre class="brush:plain;">d2 &lt;- ymd_hms("2022-01-24 12:0:5")
d2 - dhours(5)</pre></div>
<p>&nbsp;返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304104705155.png" width="556" /></p>
<div class="jb51code"><pre class="brush:plain;">d2 &lt;- ymd_hms("2022-01-24 12:0:5")
d2 + ddays(10)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304104705156.png" width="460" /></p>
<p>时间的前后推移在<strong>涉及到时区和夏时制</strong>时有可能出现<strong>未预料</strong>到的情况。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用 <strong>unclass()</strong> 函数将<strong>时间长度数据</strong>的类型转换为<strong>普通数值</strong>,如:</p>
<div class="jb51code"><pre class="brush:plain;">unclass(dhours(1))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/20220304104705157.png" width="444" /></p>
<p class="maodian"></p><h3>&nbsp;6.2&nbsp;时间周期</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;时间长度的固定单位是秒,但是像月、年这样的单位,因为可能有不同的天数,所以日历中的时间单位往往没有固定的时长。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp;lubridate</strong> 包的 <strong>seconds(), minutes(), hours(), days(),weeks(), years()</strong> 函数可以生成以日历中正常的周期为单位的时间长度,不需要与秒数相联系,可以用于时间的前后推移。这些时间周期的结果可以相加、乘以无量纲整数:</p>
<div class="jb51code"><pre class="brush:plain;">years(2) + 10*days(1)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="24" src="https://img.jbzj.com/file_images/article/202203/20220304104705158.png" width="533" /></p>
<p><strong>lubridate 的月度周期</strong>因为与已有函数名冲突,所以没有提供,需要使用 l<strong>ubridate::period(num, units=&quot;month&quot;)</strong> 的格式,其中 num 是几个月的数值。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp;为了按照日历进行日期的前后平移,而不是按照秒数进行日期的前后平移,应该使用这些时间周期。</strong>例如,因为 2016 年是闰年,按秒数给 2016-01-01 加一年,得到的并不是 2017-01-01:</p>
<div class="jb51code"><pre class="brush:plain;">ymd("2016-01-01") + dyears(1)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="24" src="https://img.jbzj.com/file_images/article/202203/20220304104705159.png" width="481" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用<strong>时间周期函数</strong>则得到<strong>预期结果</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">ymd("2016-01-01") + years(1)</pre></div>
<p>返回:</p>
<p><img alt="" height="23" src="https://img.jbzj.com/file_images/article/202203/20220304104705160.png" width="468" /></p>
<p class="maodian"></p><h3>&nbsp;6.3&nbsp;时间区间</h3>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lubridate</strong> 提供了<strong>%--%</strong> 运算符构造一个时间期间。时间区间可以求交集、并集等。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;构造如:</p>
<div class="jb51code"><pre class="brush:plain;">d1 &lt;- ymd_hms("2000-01-01 0:0:0")
d2 &lt;- ymd_hms("2000-01-02 12:0:5")
din &lt;- (d1 %--% d2); din</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="23" src="https://img.jbzj.com/file_images/article/202203/20220304104705161.png" width="569" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对一个时间区间可以用<strong>除法计算其时间长度</strong>,如</p>
<div class="jb51code"><pre class="brush:plain;">din / ddays(1)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="24" src="https://img.jbzj.com/file_images/article/202203/20220304104705162.png" width="499" /></p>
<div class="jb51code"><pre class="brush:plain;">din / dseconds(1)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="21" src="https://img.jbzj.com/file_images/article/202203/20220304104705163.png" width="465" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>生成时间区间</strong>,也可以用 <strong>lubridate::interval(start, end) </strong>函数,如</p>
<div class="jb51code"><pre class="brush:plain;">interval(ymd_hms("2000-01-01 0:0:0"), ymd_hms("2000-01-02 12:0:5"))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/20220304104706164.png" width="688" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以<strong>指定时间长度和开始日期生成时间区间</strong>,如</p>
<div class="jb51code"><pre class="brush:plain;">d1 &lt;- ymd("2022-01-24")
din &lt;- as.interval(dweeks(1), start=d1); din</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="22" src="https://img.jbzj.com/file_images/article/202203/20220304104706165.png" width="530" /></p>
<p><strong>注意</strong>这个时间区间表面上涉及到 8 个日期,但是实际长度还是只有 7 天,因为每一天的具体时间都是按零时计算,所以区间末尾的那一天实际不含在内。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用 <strong>lubridate::int_start()</strong> 和 <strong>lubridate::int_end()</strong> 函数<strong>访问时间区间的端点</strong>,如:</p>
<div class="jb51code"><pre class="brush:plain;">int_start(din)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="28" src="https://img.jbzj.com/file_images/article/202203/20220304104706166.png" width="389" /></p>
<div class="jb51code"><pre class="brush:plain;">int_end(din)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="23" src="https://img.jbzj.com/file_images/article/202203/20220304104706167.png" width="503" /></p>
<p>可以用 <strong>as.duration() 将一个时间区间转换成时间长度</strong>,用 <strong>as.period() 将一个时间区间转换为可变时长的时间周期个数</strong>。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用 <strong>lubridate::int_shift() 平移一个时间区间</strong>,如</p>
<div class="jb51code"><pre class="brush:plain;">din2 &lt;- int_shift(din, by=ddays(3)); din2</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="23" src="https://img.jbzj.com/file_images/article/202203/20220304104706168.png" width="481" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用 <strong>lubridate::int_overlaps() 判断两个时间区间是否有共同部分</strong>,如</p>
<div class="jb51code"><pre class="brush:plain;">int_overlaps(din, din2)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="24" src="https://img.jbzj.com/file_images/article/202203/20220304104706169.png" width="433" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;时间区间允许开始时间比结束时间晚,用 <strong>lubridate::int_standardize() 可以将时间区间标准化成开始时间小于等于结束时间</strong>。<strong>lubridate() 现在没有提供求交集的功能</strong>,一个<strong>自定义求交集的函数</strong>如下:</p>
<div class="jb51code"><pre class="brush:plain;">int_intersect &lt;- function(int1, int2){
n &lt;- length(int1)
int1 &lt;- lubridate::int_standardize(int1)
int2 &lt;- lubridate::int_standardize(int2)
sele &lt;- lubridate::int_overlaps(int1, int2)
inter &lt;- rep(lubridate::interval(NA, NA), n)
if(any(sele)){
inter &lt;-
lubridate::interval(pmax(lubridate::int_start(int1),
lubridate::int_start(int2)),
pmin(lubridate::int_end(int1),
lubridate::int_end(int2)))
}
inter
}</pre></div>
<p>测试如下:</p>
<div class="jb51code"><pre class="brush:plain;">d1 &lt;- ymd(c("2018-01-15", "2018-01-18", "2018-01-25"))
d2 &lt;- ymd(c("2018-01-21", "2018-01-23", "2018-01-30"))
din &lt;- interval(d1, d2); din</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="52" src="https://img.jbzj.com/file_images/article/202203/20220304104706170.png" width="757" /></p>
<p>接下来,我们用用上面自定义的函数试试:</p>
<p>首先得先导入这个函数</p>
<div class="jb51code"><pre class="brush:plain;">source("D:/桌面/R语言/int_intersect.r")</pre></div>
<p>然后,我们调用一下</p>
<div class="jb51code"><pre class="brush:plain;">int_intersect(rep(din, 2), din)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="23" src="https://img.jbzj.com/file_images/article/202203/20220304104706171.png" width="402" /></p>
<p>&nbsp;此自定义函数还可以进一步改成允许两个自变量长度不等的情形。</p>
<p class="maodian"></p><h2>7.基本 <strong>R </strong>软件的日期功能</h2>
<p class="maodian"></p><h3>7.1&nbsp;生成日期和日期时间型数据</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对<strong> yyyy-mm-dd 或 yyyy/mm/dd </strong>格式的数据,可以直接用 <strong>as.Date()</strong> 转换为 <strong>Date 类型</strong>,如:</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- as.Date("2022-1-24"); x</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="21" src="https://img.jbzj.com/file_images/article/202203/20220304104706172.png" width="342" /></p>
<div class="jb51code"><pre class="brush:plain;">as.numeric(x)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="28" src="https://img.jbzj.com/file_images/article/202203/20220304104707173.png" width="355" /></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;as.Date()</strong> 可以将多个<strong>日期字符串转换成 Date </strong>类型,如</p>
<div class="jb51code"><pre class="brush:plain;">as.Date(c("2022-1-24", "2022-01-24"))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/20220304104707174.png" width="495" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于<strong>非标准的格式</strong>,在 <strong>as.Date() 中可以增加一个 format</strong> 选项,其中用%Y 表示四位数字的年,%m 表示月份数字,%d 表示日数字。如</p>
<div class="jb51code"><pre class="brush:plain;">as.Date("1/24/2022", format="%m/%d/%Y")</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="21" src="https://img.jbzj.com/file_images/article/202203/20220304104707175.png" width="385" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用 <strong>as.POSIXct()</strong> 函数把<strong>年月日格式的日期转换为 R 的标准日期</strong>,没有时间部分就认为时间在午夜。 年月日中间的分隔符可以用<strong>减</strong>号也可以用<strong>正斜杠</strong>,但不能同时有减号又有斜杠。如</p>
<div class="jb51code"><pre class="brush:plain;">as.POSIXct(c('2022-1-24'))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304104707176.png" width="402" /></p>
<div class="jb51code"><pre class="brush:plain;">as.POSIXct(c('2022/01/24'))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304104707176.png" width="402" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;待转换的日期时间字符串,可以是年月日之后<strong>隔一个空格以 &ldquo;时: 分: 秒&rdquo; 格式 </strong> 带有时间。如</p>
<div class="jb51code"><pre class="brush:plain;">as.POSIXct('2022-01-24 13:15:45')</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304104707177.png" width="415" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用 <strong>as.POSIXct()</strong> 可以<strong>同时转换多项日期时间</strong>,如</p>
<div class="jb51code"><pre class="brush:plain;">as.POSIXct(c('1998-03-16 13:15:45', '2015-11-22 9:45:3'))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304104707178.png" width="754" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;转换后的日期变量有 class 属性,取值为<strong> </strong><strong>POSIXct</strong> 与 <strong>POSIXt</strong>, 并带有一个 <strong>tzone(时区)属性</strong>。</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- as.POSIXct(c('1998-03-16 13:15:45', '2015-11-22 9:45:3'))
attributes(x)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="114" src="https://img.jbzj.com/file_images/article/202203/20220304104707179.png" width="536" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在 <strong>as.POSIXct()</strong> 函数中用 <strong>format 参数指定一个日期格式</strong>。如</p>
<div class="jb51code"><pre class="brush:plain;">as.POSIXct('1/24/22', format='%m/%d/%y')</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="28" src="https://img.jbzj.com/file_images/article/202203/20220304104707180.png" width="498" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>如果日期仅有年和月,必须添加日(添加 01 为日即可)才能读入</strong>。比如用&rsquo;1991-12&rsquo; 表示 1991 年 12 月,则如下程序将其读入为<strong>&rsquo;1991-12-01&rsquo;</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">as.POSIXct(paste('1991-12', '-01', sep=''), format='%Y-%m-%d')</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="23" src="https://img.jbzj.com/file_images/article/202203/20220304104707181.png" width="446" /></p>
<p><strong>又如</strong></p>
<div class="jb51code"><pre class="brush:plain;">old.lctime &lt;- Sys.getlocale('LC_TIME')
Sys.setlocale('LC_TIME', 'C')</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304104708182.png" width="415" /></p>
<div class="jb51code"><pre class="brush:plain;">as.POSIXct(paste('01', 'DEC91', sep=''), format='%d%b%y')</pre></div>
<p>返回:</p>
<p><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/20220304104708183.png" width="452" /></p>
<div class="jb51code"><pre class="brush:plain;">Sys.setlocale('LC_TIME', old.lctime)</pre></div>
<p>返回:</p>
<p><img alt="" height="24" src="https://img.jbzj.com/file_images/article/202203/20220304104708184.png" width="629" /></p>
<p>&nbsp;把&#39;DEC91&#39; <strong>转换成</strong>了&rsquo;1991-12-01&rsquo;。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果明确地知道时区,在 <strong>as.POSIXct()</strong> 和 <strong>as.POSIXlt() </strong>中可以加选项<strong> tz= 字符串</strong>。选项<strong> tz 的缺省值为空字符串</strong>,这一般对应于当前操作系统的默认时区。但是,有些操作系统和 R 版本不能使用默认值,这时可以为 tz 指定时区,比如北京时间可指定为 <strong>tz=&#39;Etc/GMT+8&#39;</strong>。如</p>
<div class="jb51code"><pre class="brush:plain;">as.POSIXct('1949-10-01', tz='Etc/GMT+8')</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/20220304104708185.png" width="382" /></p>
<p class="maodian"></p><h3>7.2&nbsp;取出日期时间的组成值</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;把一个 R 日期时间值用<strong> as.POSIXlt() 转换为 POSIXlt 类型</strong>,就可以用列表元素方法取出其组成的年、月、日、时、分、秒等数值。如</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- as.POSIXct('1998-03-16 13:15:45')
y &lt;- as.POSIXlt(x)
cat(1900+y$year, y$mon+1, y$mday, y$hour, y$min, y$sec, '\n')</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="28" src="https://img.jbzj.com/file_images/article/202203/20220304104708186.png" width="436" /></p>
<p><strong>注意</strong> year 要加 1900,mon 要加 1。另外,列表元素 wday 取值 1-6 时表示星期一到星期六,取值 0 时表示星期天。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对多个日期,<strong>as.POSIXlt()</strong> 会把它们<strong>转换成一个列表</strong>(列表类型稍后讲述),这时可以用列表元素 year, mon, mday 等取出日期成分。如</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- as.POSIXct(c('1998-03-16', '2015-11-22'))
as.POSIXlt(x)$year + 1900</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304104708187.png" width="370" /></p>
<p class="maodian"></p><h3>7.3&nbsp;&nbsp;日期计算</h3>
<p>因为 <strong>Date 类型是用数值保存</strong>的,所以可以给日期加减一个整数,如:</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- as.Date("1970-1-5")
x1 &lt;- x + 10; x1</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304104708188.png" width="387" /></p>
<div class="jb51code"><pre class="brush:plain;">x2 &lt;- x - 5; x2</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="23" src="https://img.jbzj.com/file_images/article/202203/20220304104709189.png" width="399" /></p>
<p>所有的比较运算都适用于日期类型。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以给<strong>一个日期加减一定的秒数</strong>,如</p>
<div class="jb51code"><pre class="brush:plain;">as.POSIXct(c('1998-03-16 13:15:45')) - 30</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304104709190.png" width="454" /></p>
<div class="jb51code"><pre class="brush:plain;">as.POSIXct(c('1998-03-16 13:15:45')) + 10</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/20220304104709191.png" width="456" /></p>
<p>但是两个日期不能相加。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;给一<strong>个日期加减一定天数,可以通过加减秒数实现</strong>,如</p>
<div class="jb51code"><pre class="brush:plain;">as.POSIXct(c('1998-03-16 13:15:45')) + 3600*24*2</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="29" src="https://img.jbzj.com/file_images/article/202203/20220304104709192.png" width="509" /></p>
<p>这个例子把日期推后了两天。</p>
<p>用 <strong>difftime(time1, time2, units=&#39;days&#39;) </strong>计算 <strong>time1 减去 time2</strong> 的天数,如</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- as.Date("1970-1-5")
x1 &lt;- x + 10; x1</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="27" src="https://img.jbzj.com/file_images/article/202203/20220304104709193.png" width="533" /></p>
<p>函数结果用 c() 包裹以转换为数值, 否则会带有单位。</p>
<p>调用 <strong>difftime() </strong>时如果前两个自变量中含有时间部分,则<strong>间隔天数也会带有小数部分</strong>。如</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- as.POSIXct(c('1998-03-16 13:15:45', '2015-11-22 9:45:3'))
c(difftime(x, x, units='days'))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="24" src="https://img.jbzj.com/file_images/article/202203/20220304104709194.png" width="507" /></p>
<p><strong>difftime() 中 units 选项还可以取为 &#39;secs&#39;, &#39;mins&#39;, &#39;hours&#39; 等。 </strong></p>
<p class="maodian"></p><h2>练习</h2>
<p>设文件dates.csv中包含如下内容:<br />&quot;出生日期&quot;,&quot;发病日期&quot;<br />&quot;1941/3/8&quot;,&quot;2007/1/1&quot;<br />&quot;1972/1/24&quot;,&quot;2007/1/1&quot;<br />&quot;1932/6/1&quot;,&quot;2007/1/1&quot;<br />&quot;1947/5/17&quot;,&quot;2007/1/1&quot;<br />&quot;1943/3/10&quot;,&quot;2007/1/1&quot;<br />&quot;1940/1/8&quot;,&quot;2007/1/1&quot;<br />&quot;1947/8/5&quot;,&quot;2007/1/1&quot;<br />&quot;2005/4/14&quot;,&quot;2007/1/1&quot;<br />&quot;1961/6/23&quot;,&quot;2007/1/2&quot;<br />&quot;1949/1/10&quot;,&quot;2007/1/2&quot;<br />把这个文件读入为 R 数据框 dates.tab,运行如下程序定义 date1 和 date2<br />变量:</p>
<div class="jb51code"><pre class="brush:plain;">date1 &lt;- dates.tab[,' 出生日期']
date2 &lt;- dates.tab[,' 发病日期']</pre></div>
<p>(1) 把 date1、date2 转换为 R 的 POSIXct 日期型。<br />(2) 求 date1 中的各个出生年。<br />(3) 计算发病时的年龄,以周岁论(过生日才算)<br />(4) 把 date2 中发病年月转换为&rsquo;monyy&rsquo; 格式,这里 mon 是如 FEB 这样英文三字母缩写,yy 是两数字的年份。<br />(5) 对诸如&rsquo;FEB91&rsquo;, &rsquo;OCT15&rsquo; 这样的年月数据,假设 00&mdash;20 表示 21 世纪年份,21&mdash;99 表示 20 实际年份。编写 R 函数,输入这样的字符型向量,返回相应的 POSIXct 格式日期,具体日期都取为相应月份的 1 号。这个习题和后两个习题可以预习函数部分来做。<br />(6) 对 R 的 POSIXct 日期,写函数转换成&rsquo;FEB91&rsquo;, &rsquo;OCT15&rsquo; 这样的年月表示,假设 00&mdash;20 表示 21 世纪年份,21&mdash;99 表示 20 实际年份。<br />(7) 给定两个 POSIXct 日期向量 birth 和 work,birth 为生日,work 是入职日期,编写 R 函数,返回相应的入职周岁整数值(不到生日时周岁值要减一)。</p>
<p>到此这篇关于R语言日期时间的使用的文章就介绍到这了,更多相关R语言日期时间内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>R语言与格式,日期格式,格式转化的操作</li><li>R语言-实现按日期分组求皮尔森相关系数矩阵</li><li>R语言操作X轴日期实例讲解</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: R语言日期时间的使用