【问题标题】:How to calculate the timezone of these data?如何计算这些数据的时区?
【发布时间】:2016-04-08 19:26:19
【问题描述】:

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

反馈如下:

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 

假设无法从服务器获取时区,有没有办法可以根据我在这里提供的数据计算时区?想不通,希望有大神帮忙!

【问题讨论】:

  • 为什么语言标签被移除了?
  • @Pascal 问题与语言有什么关系?为什么不是 C++,Perl?
  • @helloV 这是OP的选择,你不能违背这个选择!

标签: r python-2.7 time timezone timezone-offset


【解决方案1】:

在这种情况下,很难断定评论是重复的。如果您愿意将相同的“反馈”视为重复,可以使用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)

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

【讨论】:

  • 谢谢,使用时间增量过滤是个好主意。但是当我尝试你的例子时,除了“whatever”之外的所有反馈都被删除了?
  • 这是因为所有时间增量都在 60 分钟之外。更改数据和过滤条件以查看实际想法。您需要进行调整以满足您的需要。
  • 我明白了,但是有没有一种方法可以根据时间增量进行过滤,同时保证每个唯一反馈中至少有一个保留在新的 df 中?
猜你喜欢
  • 2019-06-22
  • 2011-01-10
  • 2019-04-29
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 2012-06-07
  • 1970-01-01
相关资源
最近更新 更多