日期时间转换并仅提取时间

Ant*_*tex 17 datetime r strptime

想要将Time类更改为POSIXlt并仅提取小时分钟和秒

str(df3$Time)
chr [1:2075259] "17:24:00" "17:25:00" "17:26:00" "17:27:00" ...
Run Code Online (Sandbox Code Playgroud)

使用了strptime功能

df33$Time <- strptime(df3$Time, format = "%H:%M:%S") 
Run Code Online (Sandbox Code Playgroud)

这给出了附加的日期/时间

> str(df3$Time)
 POSIXlt[1:2075259], format: "2015-08-07 17:24:00" "2015-08-07 17:25:00" "2015-08-07 17:26:00" ...
Run Code Online (Sandbox Code Playgroud)

.

想要在不改变POSIXlt类的情况下提取时间.使用strftime函数

df3$Time <- strftime(df3$Time, format = "%H:%M:%S") 
Run Code Online (Sandbox Code Playgroud)

但是这会将类转换回"char" -

> class(df3$Time)
[1] "character"
Run Code Online (Sandbox Code Playgroud)

如何将类设置为POSIX或数字来提取时间...

rmu*_*uc8 18

如果您的数据是

a <- "17:24:00"

b <- strptime(a, format = "%H:%M:%S")
Run Code Online (Sandbox Code Playgroud)

你可以使用lubridate以获得课程的结果integer

library(lubridate)
hour(b)
minute(b)

# > hour(b)
# [1] 17
# > minute(b)
# [1] 24


# > class(minute(b))
# [1] "integer"
Run Code Online (Sandbox Code Playgroud)

你可以使用它们来组合它们

# character
paste(hour(b),minute(b), sep=":")

# numeric
hour(b) + minute(b)/60
Run Code Online (Sandbox Code Playgroud)

例如.

如果您想对数据进行任何进一步操作,我不建议这样做.但是,如果要绘制结果,可能会很方便.

  • 那你为什么不发布呢?这是OP问题的一部分. (6认同)
  • 你不需要使用lubridate来创建一个整数:`as.integer(format(Sys.time(),"%H%M%S"))`对于基本R函数可以正常工作. (3认同)

Dir*_*tel 9

日期时间对象包含日期和时间; 你不能提取'只是时间'.所以你必须考虑你想要的东西:

  • POSIXlt是一个Datetime表示(作为组件列表)
  • POSIXct是一个不同的日期时间表示(作为一个紧凑的数字)

两者都没有省略Date部分.拥有有效对象后,您可以选择仅显示时间.但是你不能使Date部分从表示中消失.

  • 尝试`format(Sys.time(),“%H%M%S”)),它在几秒钟前给了我“ 073007”,因为它刚好是我居住的上午7:30。是的,那会给你**字符**,因为那是`strftime()`和`format()`的返回值。让我们在这里停止,我建议您退后一步,阅读_ample_可用的文档。祝好运。 (2认同)

Jan*_*uGe 9

对此的“现代”tidyverse答案是使用hms::as_hms()

例如

library(tidyverse)
library(hms)

as_hms(1)
#> 00:00:01
as_hms("12:34:56")
#> 12:34:56
Run Code Online (Sandbox Code Playgroud)

或者,使用您的示例数据:

x <- as.POSIXlt(c("17:24:00", "17:25:00", "17:26:00", "17:27:00"), format = "%H:%M:%S")

x
#>[1] "2021-04-10 17:24:00 EDT" "2021-04-10 17:25:00 EDT" "2021-04-10 17:26:00 EDT" "2021-04-10 17:27:00 EDT"

as_hms(x)
# 17:24:00
# 17:25:00
# 17:26:00
# 17:27:00

Run Code Online (Sandbox Code Playgroud)

另请参阅此处的文档: https ://hms.tidyverse.org/reference/hms.html


mpe*_*tis 7

这是我从日期时间对象中获取时间部分的习惯用法。我使用floor_date()from lubridate 来获取时间戳的午夜,并取时间戳和当天午夜的差值。我创建并存储一个在数据帧中hms提供的对象lubridate(我相信),因为该类的格式hh:mm:ss易于阅读,但底层值是秒的数值。这是我的代码:

library(tidyverse)
library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#> 
#>     date

# Create timestamps
#
# Get timepart by subtacting the timestamp from it's floor'ed date, make sure
# you convert to seconds, and then cast to a time object provided by the
# `hms` package.
# See: https://www.rdocumentation.org/packages/hms/versions/0.4.2/topics/hms
dt <- tibble(dt=c("2019-02-15T13:15:00", "2019-02-19T01:10:33") %>% ymd_hms()) %>%
  mutate(timepart = hms::hms(as.numeric(dt - floor_date(dt, "1 day"), unit="secs")))

# Look at result
print(dt)
#> # A tibble: 2 x 2
#>   dt                  timepart
#>   <dttm>              <time>  
#> 1 2019-02-15 13:15:00 13:15   
#> 2 2019-02-19 01:10:33 01:10

# `hms` object is really a `difftime` object from documentation, but is made into a `hms`
# object that defaults to always store data in seconds.
dt %>% pluck("timepart") %>% str()
#>  'hms' num [1:2] 13:15:00 01:10:33
#>  - attr(*, "units")= chr "secs"

# Pull off just the timepart column
dt %>% pluck("timepart")
#> 13:15:00
#> 01:10:33

# Get numeric part.  From documentation, `hms` object always stores in seconds.
dt %>% pluck("timepart") %>% as.numeric()
#> [1] 47700  4233
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.2.1)于 2019-02-15 创建


小智 6

您还可以使用该chron包仅提取一天中的时间:

library(chron) 

# current date/time in POSIXt format as an example
timenow <- Sys.time()

# create chron object "times"
onlytime <- times(strftime(timenow,"%H:%M:%S"))

> onlytime
[1] 14:18:00
> onlytime+1/24
[1] 15:18:00
> class(onlytime)
[1] "times"
Run Code Online (Sandbox Code Playgroud)