首页 > 解决方案 > 如何将带有时间戳的字符列转换为用于 R 中计算的有用格式

问题描述

我有两个数据框,每个数据框都有一个字符格式的“TIMESTAMP”列

我想将数据框添加在一起,因为它们具有完全相同的结构。
一个数据框包含 2000 年到 2003 年的数据,另一个数据框包含 2002 年到 2010 年的数据,因此它们具有相同的 2002 年和 2003 年数据。当我将它们合并时,我希望 2002 年和 2003 年没有重复。

我有什么可能性?我试过newdata <- rbind(data1, data2)了,但在这里我得到了重复项。
是否有可能只添加不会重复的“TIMESTAMP”?

前:

TIMESTAMP                PRICE   AMOUNT
2000-01-15 10:15:00      15      120 
2002-05-05 17:15:00      20      100
2003-03-14 12:30:00      22      170

TIMESTAMP                PRICE   AMOUNT
2003-03-14 12:30:00      22      170
2007-12-10 11:55:00      30      200
2010-10-05 12:10:00      44      240

如您所见2003-03-14 12:30:00,两个数据框中的内容相同。
我想要这样的输出:

TIMESTAMP                PRICE   AMOUNT
2000-01-15 10:15:00      15      120 
2002-05-05 17:15:00      20      100
2003-03-14 12:30:00      22      170
2007-12-10 11:55:00      30      200
2010-10-05 12:10:00      44      240

我想用这些数据做一个事件研究,所以我认为日期时间格式是这个标准还是我错了?

标签: rdataframedatetimetimestamp

解决方案


这取决于。

如果您想仅基于 删除重复项TIMESTAMP,则

## base R
rbind(dat1, subset(dat2, !TIMESTAMP %in% dat1$TIMESTAMP))
#              TIMESTAMP PRICE AMOUNT
# 1  2000-01-15 10:15:00    15    120
# 2  2002-05-05 17:15:00    20    100
# 3  2003-03-14 12:30:00    22    170
# 21 2007-12-10 11:55:00    30    200
# 31 2010-10-05 12:10:00    44    240

## dplyr
library(dplyr)
filter(dat2, !TIMESTAMP %in% dat1$TIMESTAMP) %>%
  bind_rows(dat1, .)

如果您希望它基于整行相同(例如,您可能有两个相同TIMESTAMP但具有不同的值),那么您可以这样做

## base R
dat12 <- rbind(dat1, dat2)
dat12[!duplicated(dat12),]
#             TIMESTAMP PRICE AMOUNT
# 1 2000-01-15 10:15:00    15    120
# 2 2002-05-05 17:15:00    20    100
# 3 2003-03-14 12:30:00    22    170
# 5 2007-12-10 11:55:00    30    200
# 6 2010-10-05 12:10:00    44    240

## dplyr
bind_rows(dat1, dat2) %>%
  filter(!duplicated(.))

注意:这些都不是TIMESTAMP字符串以外的任何东西;对于这些操作,这可能没问题。最终,如果您将使用时间戳(即时差)做类似数字的事情,那么您需要将它们转换POSIXt

## base R
dat12$TIMESTAMP <- as.POSIXct(dat12$TIMESTAMP)

## dplyr
dat12 <- mutate(dat12, TIMESTAMP = as.POSIXct(TIMESTAMP))

尽管这带来了一个明显的问题:如果其中任何一个包含亚秒级,那么查找重复项可能会有问题。因为它们在内部存储为numeric(带有类),所以浮点相等存在一个已知问题。有关这方面的示例,请参阅为什么这些数字不相等?,浮点数学有问题吗?,和https://en.wikipedia.org/wiki/IEEE_754。只要您的数据通常具有不小于秒的分辨率,您可能永远不会遇到问题。浮点相等的问题在于它从来都不是警告或错误,所以即使你一个,你也可能看不到它。您唯一的指示可能是数据中出现重复项。

注意 2:R 在控制台上打印时间时默认为“秒”分辨率,但这并不意味着数据中没有毫秒。

now <- Sys.time()
now
# [1] "2021-08-27 12:16:58 EDT"
options(digits.secs = 3)
now
# [1] "2021-08-27 12:16:58.539 EDT"

我没有改变now,这只是控制台上如何打印数据的问题,而不是数据实际包含的内容。

要在转换为POSIXt-class 后解决重复数据删除问题,如果您在任何地方都具有亚秒级精度,那么您需要采取更多步骤才能确信它正在做您需要的事情。(这个答案可能太多了。)


数据

dat1 <- structure(list(TIMESTAMP = c("2000-01-15 10:15:00", "2002-05-05 17:15:00", "2003-03-14 12:30:00"), PRICE = c(15L, 20L, 22L), AMOUNT = c(120L, 100L, 170L)), row.names = c(NA, -3L), class = "data.frame")
dat2 <- structure(list(TIMESTAMP = c("2003-03-14 12:30:00", "2007-12-10 11:55:00", "2010-10-05 12:10:00"), PRICE = c(22L, 30L, 44L), AMOUNT = c(170L, 200L, 240L)), row.names = c(NA, -3L), class = "data.frame")

推荐阅读