web-dev-qa-db-ja.com

日時の変換と時刻のみの抽出

TimeのクラスをPOSIXltに変更し、時間分と秒のみを抽出したい

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

Strptime関数を使用しました

df33$Time <- strptime(df3$Time, format = "%H:%M:%S") 

これにより、日付/時刻が追加されます

> 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" ...

POSIXltクラスを変更せずに時間だけを抽出したかった。 strftime関数を使用する

df3$Time <- strftime(df3$Time, format = "%H:%M:%S") 

しかし、これはクラスを「char」に戻します-

> class(df3$Time)
[1] "character"

クラスをPOSIXまたは数値に設定して時間を抽出するにはどうすればよいですか...

15
Antex

データが

a <- "17:24:00"

b <- strptime(a, format = "%H:%M:%S")

クラスlubridateの結果を得るためにintegerを使用できます

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

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


# > class(minute(b))
# [1] "integer"

を使用してそれらを組み合わせることができます

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

# numeric
hour(b) + minute(b)/60

例えば。

データに対してさらに操作を行う場合は、そのようにすることはお勧めしません。ただし、結果をプロットする場合は、便利な場合があります。

16
rmuc8

date timeオブジェクトには日付と時刻が含まれます。 「ジャストタイム」を抽出することはできません。だから、あなたはあなたが望むものを熟考する必要があります:

  • POSIXltはDatetime表現です(コンポーネントのリストとして)
  • POSIXctは(コンパクトな数値としての)異なるDatetime表現です

どちらも日付部分を省略しません。有効なオブジェクトを取得したら、display時間のみを選択できます。ただし、日付部分を表示から非表示にすることはできません。

9

chronパッケージを使用して、1日の時刻のみを抽出することもできます。

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"
4
julbyk

これは、日時オブジェクトからタイムパートだけを取得するための私のイディオムです。 lubridateのfloor_date()を使用して、タイムスタンプの真夜中を取得し、タイムスタンプとその日の真夜中の差を取得します。クラスのhh:mm:ssの書式設定は読みやすいが、基になる値は秒の数値であるため、hmsで提供されるlubridateオブジェクトを作成してデータフレームに格納します。ここに私のコードがあります:

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

2019-02-15に reprexパッケージによって作成 (v0.2.1)

2
mpettis

POSIX形式で必要な場合、唯一の方法は、そのままにして、表示するたびに「時間」部分のみを抽出することです。ただし、内部的には常に日付と時刻になります。ただし、数値にしたい場合は、単純に数値に変換できます。たとえば、一日の始まりから経過した秒数として時間を取得するには:

df3$Time=df3$Time$sec + df3$Time$min*60 + df3$Time$hour*3600
1
Maksim Gayduk