【发布时间】:2019-11-01 22:23:33
【问题描述】:
我必须从不稳定的原始数据中精确地制作数据。
我不能使用data.table 包中的second() 从不稳定的第二分钟开始,前半分钟向下舍入,后半部分向上舍入。对于越来越多的原始数据,这不是好方法,效果不佳。
这是我的示例数据框:
library(data.table)
df <- read.table(text="
datetime ,val
2019-06-19 08:25:55.470,1706506
2019-06-19 08:24:55.560,1706504
2019-06-19 08:24:07.087,1706502
2019-06-19 08:22:55.510,1706500
2019-06-19 08:22:00.080,1706497
2019-06-19 08:21:44.977,1706495
2019-06-19 08:19:55.533,1706493
2019-06-19 08:18:55.470,1706491
2019-06-19 08:18:17.610,1706488
2019-06-19 08:16:55.567,1706486
2019-06-19 08:15:55.440,1706484
2019-06-19 08:14:55.543,1706481
2019-06-19 08:13:55.427,1706479
2019-06-19 08:13:06.477,1706477
2019-06-19 08:12:21.043,1706475
2019-06-19 08:10:55.420,1706473
2019-06-19 08:09:55.447,1706471
2019-06-19 08:08:55.477,1706469
2019-06-19 08:07:55.443,1706467
2019-06-19 08:06:55.550,1706465",sep=",",header=TRUE,stringsAsFactors=FALSE)
df$datetime <- as.POSIXct(df$datetime)
直接一分钟后,结果很糟糕:
> minute(df$datetime[second(df$datetime) > 30]) = minute(df$datetime[second(df$datetime) > 30]) + 1
> second(df$datetime) <- 0
> df
datetime val
1 2019-06-19 08:26:00 1706506
2 2019-06-19 08:25:00 1706504
3 2019-06-19 08:24:00 1706502
4 2019-06-19 08:23:00 1706500
5 2019-06-19 08:22:00 1706497
6 2019-06-19 08:22:00 1706495
7 2019-06-19 08:20:00 1706493
8 2019-06-19 08:19:00 1706491
9 2019-06-19 08:18:00 1706488
10 2019-06-19 08:17:00 1706486
11 2019-06-19 08:16:00 1706484
12 2019-06-19 08:15:00 1706481
13 2019-06-19 08:14:00 1706479
14 2019-06-19 08:13:00 1706477
15 2019-06-19 08:12:00 1706475
16 2019-06-19 08:11:00 1706473
17 2019-06-19 08:10:00 1706471
18 2019-06-19 08:09:00 1706469
19 2019-06-19 08:08:00 1706467
20 2019-06-19 08:07:00 1706465
08:20:00 - 08:22:00 失败
任何帮助将不胜感激!
已编辑:这里有更多原始数据 CSV 链接 here
【问题讨论】:
-
为什么说它失败了?您不想四舍五入到最近的分钟吗?
-
@sindri_baldur 丢失和重复分钟
-
这还不清楚。这些行的预期输出是什么?
-
源行是
08:22:00.080和08:21:44.977,因此08:22作为两者的结果都是有意义的,对吧? -
我希望第 6 行应该是
6 2019-06-19 08:21:00 1706495,因为它可能是由于延迟将数据上传到数据库服务器而记录设备问题。它每分钟记录一次,该行的值来自08:21:00
标签: r dataframe data.table lubridate