![如何在 R 中处理时间戳中的时区?](https://linux22.com/image/110879/%E5%A6%82%E4%BD%95%E5%9C%A8%20R%20%E4%B8%AD%E5%A4%84%E7%90%86%E6%97%B6%E9%97%B4%E6%88%B3%E4%B8%AD%E7%9A%84%E6%97%B6%E5%8C%BA%EF%BC%9F%20.png)
我给出的非 UTC 时区时间为 2016 年 8 月 17 日 21:41,瑞典时区 (UTC+1)。每个条目我都有两个这样的录音。我正在考虑如何将它们很好地记录在 CSV 文件中。我首先想到将它们手动转换为 Unix 时间戳,但后来开始考虑将原始时区等170820162141
与时区的单独列一起维护。但我仍然认为这些版本并不是任何标准。我确实知道如何基于线程生成 Unix 时间戳如何生成 Unix 时间戳?以下命令结构也可以在这里工作。
% https://stackoverflow.com/a/2764285/54964
date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"
我将用R
// Bash
/ Zsh
.... 读取 CSV 文件 我的建议
- 自定义时间标记等前一种,例如
170820162141
没有秒 - 时区等的单独列
UTC+1
CSV 文件示例
Time_start, Time_end, Time_start_timezone
170820162141, 180820160901, UTC+1
测试函数伪代码
Count time difference between two custom timestamps.
迭代thrig的提案
我将数据更改为
- 在 中添加时区
+0100
(UTC+1), , , 03012011-2011+0100, 03022011-2011+0100
。 - 格式化
strptime(from,format="%d%m%Y-%H%M%z
我添加的%z
时区。 data
如果给定数据的时区设置正确,则打印会正确显示所有时间。
代码在五列数据上运行Rscript script.r
,其中时间数据在最后两列
library('methods')
# https://unix.stackexchange.com/a/363290/16920
setClass('iso8601')
#03012011-2011
setAs("character","iso8601",function(from) strptime(from,format="%d%m%Y-%H%M%z"))
data <- read.csv("/home/masi/Documents/Data/log.csv", colClasses=c(NA, NA, NA, "iso8601","iso8601"), header=TRUE) # my particular case
data
输出:完美!我必须根据我的数据正确调整时区,因为我的时区经常变化。
- 没有
library('methods')
,你得到Rscript Error: could not find function "setClass"
。
答案1
ISO 8601 是一种可能的格式;它可以包含时区偏移量,并且可以用strptime
多种语言进行解析。
$ cat x
2017-05-05T18:25:28+0100,2017-05-05T18:33:22+0100,foo
2017-05-05T18:34:21+0100,2017-05-05T18:38:52+0100,bar
$ R -q --silent --no-save
> R.version.string
[1] "R version 3.4.0 (2017-04-21)"
> setClass('iso8601')
> setAs("character","iso8601",function(from) strptime(from,format="%Y-%m-%dT%H:%M:%S%z"))
> data=read.csv("x",colClasses=c("iso8601","iso8601",NA),header=FALSE)
> data
V1 V2 V3
1 2017-05-05 17:25:28 2017-05-05 17:33:22 foo
2 2017-05-05 17:34:21 2017-05-05 17:38:52 bar
>
等等date
可以生成 ISO 8601 格式的日期:
$ date "+%Y-%m-%dT%H:%M:%S%z"
2017-05-05T19:20:58+0000
$ TZ=US/Pacific date "+%Y-%m-%dT%H:%M:%S%z"
2017-05-05T12:21:10-0700
$