如何处理dataframe datetime列中的不稳定秒来获取分钟数据?

如何处理dataframe datetime列中的不稳定秒来获取分钟数据?,r,dataframe,data.table,lubridate,R,Dataframe,Data.table,Lubridate,我必须从不稳定的原始数据中逐分钟生成数据。 我不能使用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

我必须从不稳定的原始数据中逐分钟生成数据。 我不能使用
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)
库(data.table)
df 30])=分钟(df$datetime[秒(df$datetime)>30])+1
>第二(df$datetime)df
日期时间值
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链接

这里是我想你想要的

尽管我建议查看源数据

library(data.table)

DT <- fread(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)

DT[, datetime := as.POSIXct(as.character(round(as.POSIXct(datetime), "mins")))]
DT[, diff := c(-60, diff(datetime))]
DT[diff == 0, datetime := datetime-60][, diff := NULL]
print(DT)

这是我认为你想要的

尽管我建议查看源数据

library(data.table)

DT <- fread(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)

DT[, datetime := as.POSIXct(as.character(round(as.POSIXct(datetime), "mins")))]
DT[, diff := c(-60, diff(datetime))]
DT[diff == 0, datetime := datetime-60][, diff := NULL]
print(DT)


你为什么说它失败了?你不想把时间缩短到最近的一分钟吗?@sindri_baldur失踪和重复的一分钟这还不清楚。这些行的预期输出是什么?源行是
08:22:00.080
08:21:44.977
,因此
08:22
作为这两个行的结果是有意义的,对吗?我希望第6行应该是
6 2019-06-19 08:21:00 1706495
,因为它可能是由于延迟将数据上传到数据库服务器而导致的记录设备问题。它每分钟记录一次,此行的值是从
08:21:00
为什么说它失败了?你不想把时间缩短到最近的一分钟吗?@sindri_baldur失踪和重复的一分钟这还不清楚。这些行的预期输出是什么?源行是
08:22:00.080
08:21:44.977
,因此
08:22
作为这两个行的结果是有意义的,对吗?我希望第6行应该是
6 2019-06-19 08:21:00 1706495
,因为它可能是由于延迟将数据上传到数据库服务器而导致的记录设备问题。它每分钟记录一次,这一行的值是从
08:21:00
Thank and upvoted,它与示例很好地配合,但与整个原始数据不配合。请通过此链接查看此CSV,请使用导致问题的部分行更新问题。
500 2019-06-19 08:20:00 1706493
501 2019-06-19 08:22:00 1706495
502 2019-06-19 08:21:00 1706497
503 2019-06-19 08:23:00 1706500
找到日期时间切换(分钟:20-19-21-23)在尝试了1054行之后。我应该只对datetime进行排序吗?在只对datetime列进行排序之后,它看起来不错,但不确定它是否会涵盖所有情况。不管怎样,非常感谢。谢谢,经过投票,它对示例很有效,但对整个原始数据无效。请通过此链接查看此CSV,请使用导致问题的部分行更新问题。
500 2019-06-19 08:20:00 1706493
501 2019-06-19 08:22:00 1706495
502 2019-06-19 08:21:00 1706497
503 2019-06-19 08:23:00 1706500
找到日期时间切换(分钟:20-19-21-23)在尝试了1054行之后。我应该只对datetime进行排序吗?在只对datetime列进行排序之后,它看起来不错,但不确定它是否会涵盖所有情况。无论如何,非常感谢你。
               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:21: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