【问题标题】:05:00:00 - 28:59:59 time format05:00:00 - 28:59:59 时间格式
【发布时间】:2014-08-09 22:28:55
【问题描述】:

我有数据集,其中time.start 从 5:00:00 到 28:59:59 变化(即 01.01.2013 28:00:00 实际上是 02.01.2013 04:00:00)。日期采用%d.%m.%Y 格式。

      Date Time.start   
01.01.2013   22:13:07
01.01.2013   22:52:23
01.01.2013   23:34:06
01.01.2013   23:44:25
01.01.2013   27:18:48
01.01.2013   28:41:04

我想把它转换成正常的日期格式。

dates$date <- paste(dates$Date,dates$Time.start, sep = " ")
dates$date <- as.POSIXct(strptime(dates$date, "%m.%d.%Y %H:%M:%S"))

但显然我有 NA 时间 > 23:59:59

我应该如何修改我的代码?

【问题讨论】:

  • 提醒我日本电视节目安排的时间范围,当他们使用非 24 小时时间(例如,“深夜 3:00”表示第二天凌晨 3 点)时,这会变得很愚蠢。跨度>
  • 确实,您会看到酒吧广告他们营业到凌晨 1 点等“25:00”。
  • 通过在数据库中偏移 -5 小时进行标准化,并在实际使用数据时添加 +5。 :) [With a -5, you be in 00:00:00 - 23:59:59 range.]
  • 他们为什么要使用 05:00:00 - 28:59:59?
  • @Panzercrisis:如果一家企业每天从上午 1:00 到 7:00 关门,并且工作周从周一 00:00:00.01 到周日 23:59:59.99,则工作从周日下午 5:00 开始到周一凌晨 1:00 结束的轮班将有 7 个小时归于一份薪水,一个归于下一份薪水。将班次记录为周日从 17:00 到 25:00 可以避免这个问题。

标签: r date posixct


【解决方案1】:

例如将时间作为秒添加到日期:

df <- read.table(header=T, text="      Date Time.start   
01.01.2013   22:13:07
01.01.2013   22:52:23
01.01.2013   23:34:06
01.01.2013   23:44:25
01.01.2013   27:18:48
01.01.2013   28:41:04", stringsAsFactors=FALSE)

as.POSIXct(df$Date, format="%d.%m.%Y") +
  sapply(strsplit(df$Time.start, ":"), function(t) {
    t <- as.integer(t)
    t[3] + t[2] * 60 + t[1] * 60 * 60
  })

# [1] "2013-01-01 22:13:07 CET" "2013-01-01 22:52:23 CET" "2013-01-01 23:34:06 CET"
# [4] "2013-01-01 23:44:25 CET" "2013-01-02 03:18:48 CET" "2013-01-02 04:41:04 CET"

【讨论】:

  • 如何使用scan 直接从日期中读取整数。没有 strsplit 也没有强制。我真的很喜欢你的这个主意。
  • 您的解决方案比@akrun 更快。我有 180 000 行的数据框,创建向量需要 2.5 秒,而使用 with 命令需要 31 秒
  • 现在我遇到了这个脚本的功能问题。 =(stackoverflow.com/questions/24308718/…
【解决方案2】:

只是对lukeAs解决方案的修改:

with(df, as.POSIXct(Date, format="%d.%m.%Y")+
 colSums(t(read.table(text=Time.start, sep=":",header=F))*c(3600,60,1)))
[1] "2013-01-01 22:13:07 EST" "2013-01-01 22:52:23 EST" 
[3] "2013-01-01 23:34:06 EST" "2013-01-01 23:44:25 EST"
[5] "2013-01-02 03:18:48 EST" "2013-01-02 04:41:04 EST"

【讨论】:

    【解决方案3】:

    使用lubridate

    with(dates, mdy(Date) + hms(Time.start))
    

    生成:

    [1] "2013-01-01 22:13:07 UTC" "2013-01-01 22:52:23 UTC"
    [3] "2013-01-01 23:34:06 UTC" "2013-01-01 23:44:25 UTC"
    [5] "2013-01-02 03:18:48 UTC" "2013-01-02 04:41:04 UTC"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-05
      • 2021-06-11
      • 1970-01-01
      • 2013-12-06
      • 2021-09-04
      • 2015-03-21
      • 2023-02-25
      • 1970-01-01
      相关资源
      最近更新 更多