【问题标题】:How to deal with instable second in dataframe datetime column to get minutely data?如何处理数据框日期时间列中的不稳定秒以获取分钟数据?
【发布时间】: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.08008:21:44.977,因此08:22 作为两者的结果都是有意义的,对吧?
  • 我希望第 6 行应该是 6 2019-06-19 08:21:00 1706495,因为它可能是由于延迟将数据上传到数据库服务器而记录设备问题。它每分钟记录一次,该行的值来自08:21:00

标签: r dataframe data.table lubridate


【解决方案1】:

这就是我认为你所追求的。

尽管我建议查看源数据。

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)

结果:

               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

【讨论】:

  • 感谢并支持,它适用于示例,但不适用于整个原始数据。您能否通过此链接查看此 CSV here
  • 请用一些导致问题的行来更新问题。
  • 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 在尝试 1054 行后发现日期时间切换(分钟:20-19-21-23)。我应该只对日期时间进行排序吗?
  • 仅对日期时间列进行排序后看起来不错,但不确定它是否会涵盖所有情况。无论如何,非常感谢。
猜你喜欢
  • 2015-01-02
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2020-06-13
  • 2016-03-07
  • 2021-04-17
相关资源
最近更新 更多