【问题标题】:Reduce time precision in a time series to minutes from seconds将时间序列中的时间精度从秒降低到分钟
【发布时间】:2014-11-08 19:14:03
【问题描述】:

我有以下日期格式的财务时间序列数据:“%Y-%m-%d %H:%M:%S”我正在尝试有效地将其时间精度降低到分钟而不是秒。

样本数据:

  dd <- c("2014-02-23","2014-03-12", "2014-05-29")
    tt <- c("03:15:52", "03:49:17", "04:03:24", "05:30:19", "05:56:49",
    "06:14:04", "09:42:13", "11:57:25", "11:58:02", "12:12:49",
    "15:38:00", "15:44:21", "16:16:04")
    dt <- c(outer(dd,tt,paste))
    xx <- as.xts(seq_along(dt), as.POSIXct(dt))

XX 是用来演示我所做的事情的对象,我试图像这样修复岁差

xx1 <- as.xts(xx,substr(index(xx),1,16),format="%Y-%m-%d %H:%M")

这不起作用,然后我添加了 strftime() 函数来制作索引字符串,然后再获取我需要的部分。

xx1 <- as.xts(xx,substr(strftime(index(xx)),1,16),format="%Y-%m-%d %H:%M")

那也没用,我仍然可以得到完整的分辨率,包括秒部分。 我想要实现的是:

2014-02-23 03:15    
2014-02-23 03:49   
2014-02-23 04:03 

代替:

2014-02-23 03:15:52
2014-02-23 03:49:17 
2014-02-23 04:03:24 

align_time 函数将秒数向上移动到下一秒并保持秒数的精度

【问题讨论】:

    标签: r xts


    【解决方案1】:

    两个问题:

    1. 基础类型是POSIXct,它被定义为自纪元以来的小数秒,因此您不仅有秒数,还有亚秒数——Windoze 上的毫秒,操作系统上的微秒,以X。所以你“无法摆脱(亚)秒”,但你可以查看round(),它有一个时间对象的方法。

    2. 表示与显示不同。即使是亚秒级,您仍然可以按您想要的格式进行格式化,即显示为文本。

    当 Roland 提交他的评论时,我只是在处理你的数据以显示 round()trunc()

    R> head(round(index(xx), units="mins"))
    [1] "2014-02-23 03:16:00 CST" "2014-02-23 03:49:00 CST"
    [3] "2014-02-23 04:03:00 CST" "2014-02-23 05:30:00 CST"
    [5] "2014-02-23 05:57:00 CST" "2014-02-23 06:14:00 CST"
    R> head(trunc(index(xx), units="mins"))
    [1] "2014-02-23 03:15:00 CST" "2014-02-23 03:49:00 CST"
    [3] "2014-02-23 04:03:00 CST" "2014-02-23 05:30:00 CST"
    [5] "2014-02-23 05:56:00 CST" "2014-02-23 06:14:00 CST"
    R> 
    

    【讨论】:

    • 如果您有其他原因丢弃秒数而不仅仅是显示数据,您可以像这样简单地使用trunc.POSIXtindex(xx) &lt;- trunc(index(xx), units="mins")
    • 是的。只是在你输入的时候准备那个例子。
    • 我对包括秒数在内的时间的担忧是:当您指定更多“数字”时,时间段窗口会缩小。我目前的理解是,如果我指定从 16:03 到 16:04 的时间段,那么我正在查看的窗口在整个 2 分钟内从 [16:03 到 16:04) 开始。但是 16:03:00 到 16:04:00 在 16:04:00 开始时结束。因此,例如 16:04:01 不包括在该时间段内。这就是我努力消除秒数的原因。
    • @user2004820 我不关注。 .xts(1:1e4, 1:1e4, tzone="UTC")["1970-01-01 00:01/1970-01-01 00:02"] 返回两分钟。 .xts(1:1e4, 1:1e4, tzone="UTC")["1970-01-01 00:01:00/1970-01-01 00:02:00"] 返回一分钟。
    • 2014 指全年,2014-06 指 2014 年 6 月整月,2014-06-03 03 指当天凌晨 3:00 小时,03:10 指整分钟,而 03:10:00 仅指一秒。所以 03:10 和 03:10:00 之间的区别是第一个是一分钟,第二个是一秒。我想要完成的是指整个 03:10 分钟而不是第一秒。
    【解决方案2】:
    strptime(dt, '%Y-%m-%d %H:%M')
    #[1] "2014-02-23 03:15:00" "2014-03-12 03:15:00" "2014-05-29 03:15:00" "2014-02-23 03:49:00"
    #[5] "2014-03-12 03:49:00" "2014-05-29 03:49:00" "2014-02-23 04:03:00" "2014-03-12 04:03:00"
    #[9] "2014-05-29 04:03:00" "2014-02-23 05:30:00" "2014-03-12 05:30:00" "2014-05-29 05:30:00"
    

    【讨论】:

    • 我试图评估整分钟内的事件,我担心 03:15:00 仅指第一秒,而 03:15 指整分钟。如果我只做一个计算,我会对此进行测试并完成它,但我正在使用这些数据使用不同的 R 包执行不同的计算。
    猜你喜欢
    • 2013-02-23
    • 2020-03-18
    • 2016-06-18
    • 2019-07-24
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2020-09-15
    • 2011-06-15
    相关资源
    最近更新 更多