如何计算这些数据的时区?

How to calculate the timezone of these data?

我有一个非常大的客户反馈数据集,我想删除重复项。

反馈如下:

Great service!, n days ago
OK, n days ago
Could be better, n days ago
Awesome, n days ago
YES!, n days ago 

为了获得每个反馈的时间戳,我从文件下载到我的计算机的时间(例如 2015-07-06 EST - 5 days = 2015-07-01)中减去 n days ago(例如 5 days ago)。

问题是我不知道我下载的服务器的时区,即反馈被记录的时间,所以来自同一个客户的一些相同的反馈被记录了两次。服务器已关闭,我无法访问。

示例:

Feedback, Timestamp
Great service!, 2015-07-05 00:00
Great service!, 2015-07-04 02:00
OK, 2015-04-07 09:00
OK, 2015-04-06 17:00
Could be better, 2015-08-08 01:00
Could be better, 2015-08-07 13:00
Awesome, 2015-07-10 03:00 
Awesome, 2015-07-09 19:00   
YES!, 2015-03-20 03:00 
YES!, 2015-03-19 13:00 

假设无法从服务器获取时区,是否可以根据我在此处提供的数据计算时区?我想不通,所以我希望那里的人能帮忙!

在这种情况下很难断定评论是重复的。如果您愿意将相同的 'Feedback' 视为重复项,则可以使用 dplyr 如下过滤第一行:

library(dplyr)
df <- data.frame(Feedback = c('Great service!', 'Great service!', 'OK', 'OK', 'Could be better', 'Could be better', 'Awesome', 'Awesome', 'YES!', 'YES!', 'Whatever'), Timestamp = as.POSIXct(c('2015-07-05 00:00', '2015-07-04 02:00',
                                      '2015-04-07 09:00', '2015-04-06 17:00',
                                      '2015-08-08 01:00', '2015-08-07 13:00',
                                      '2015-07-10 03:00', '2015-07-09 19:00',
                                      '2015-03-20 03:00', '2015-03-19 13:00',
                                      '2015-04-19 01:00')), stringsAsFactors = FALSE)
df <- df %>% arrange(Feedback, Timestamp) %>% group_by(Feedback) %>% slice(1)

或者,如果你想使用某种时间增量阈值,你可以使用这样的条件 filter:

df <- df %>% arrange(Feedback, Timestamp) %>% group_by(Feedback) %>% filter(n() == 1 | as.numeric(difftime(max(Timestamp), min(Timestamp), units = 'mins')) < 60)

如果您想计算时间增量,请按照以下方法进行操作。如您所见,它们超过了我在上面示例中使用的 60 分钟阈值:

df <- df %>% arrange(Feedback, Timestamp) %>% group_by(Feedback) %>% summarise(timedelta = as.numeric(difftime(max(Timestamp), min(Timestamp), units = 'mins')))
df
Source: local data frame [6 x 2]

         Feedback timedelta
            (chr)     (dbl)
1         Awesome       480
2 Could be better       720
3  Great service!      1320
4              OK       960
5        Whatever         0
6            YES!       840

更新:根据下面的评论,要始终保留第一次出现,请使用以下内容:

df <- df %>% arrange(Feedback, Timestamp) %>% group_by(Feedback) %>% mutate(Timedelta = as.numeric(difftime(Timestamp, lag(Timestamp), units = 'mins'))) %>% filter(is.na(Timedelta) | Timedelta > 60) %>% select(-Timedelta)

我正在创建一个额外的列并取消选择它以使事情更容易理解。有一种方法可以将表达式组合到过滤器本身,这有点复杂。