R. 日付や時間
Data Campで学んだことの記録です。
0.ISO 8601 datetimes
YYYY-MM-DD HH:MM:SS TZ
と表された日時の形式
それぞれ以下のようにあらわせる
YYYY ー 年
MM ー 月
DD ー 日
HH ー 時(hour)
MM ー 分
SS ー 秒
1.パッケージの読み込み
今回は、lubridate/anytime/hms/readrを読み込む。
# libridateの読み込み
library(lubridate)
# 他のパッケージの読み込み
library(anytime)
library(hms)
library(readr)
2.現在の日時を取得する
# today()を用いて今日の日付を取得する
today() # "2022-12-29"
# 時間も一緒に取得する
now() # "2022-12-29 13:01:58 JST"
3.CSVからdatetimeデータを読み込む
readrパッケージから以下のような関数を用いる。
read_csv(filename,
col_types = cols(
# dateコラムを指定する
date_col = col_date("%m/%d/%Y")
# datetimeコラムを指定する
datetime_col = col_datetime("%m/%d/%Y %I:%M:%S %p")
# timeコラムを指定する
time_col = col_time("%I:%M:%S %p")
))
4.データの変換
anytimeパッケージ内の関数を使う。
1.自動変換
# datesをフォーマット通りに変換する
anydate(c("Jun 16, 1915", "18 October 1919"))
# "1915-06-16" "1919-10-18"
# datetimesをフォーマット通りに変換する
anytime(c("22 Nov 1963 13:30", "September 15 1901 02:15"), tz = "EST")
# "1963-11-21 23:30:00 EST" "1901-09-14 12:15:00 EST"
2.手作業的な変換
## dates
# year month date
ymd("1759 09 22") # "1759-09-22"
# month-day-year
mdy("05-12-1820") # "1820-05-12"
# day/month/year
dmy("01/09/1835") # "1835-09-01"
## datetimes
# datetimes in ISO format
ymd_hms("1972-06-30 23:59:59") # "1972-06-30 23:59:59 UTC"
# datetimes in a single format
fast_strptime("January 1, 1924", "%B %d, %Y") # "1924-01-01 UTC"
# datetimes in multiple spesified formats
parse_date_time(c("Jun 16, 1915", "18 October 1919"),
c("%b %d, %Y", "d %B %Y")) # "1915-06-16 UTC" "1919-10-18 UTC"
3.時間の変換
hmsパッケージを使う。
# 時間のみ
hms(56, 12, 15)
5.要素から日時を作る
日時を作る
# dates
make_date(1777, 4, 30) # "1777-04-30"
# datetimes
make_datetime(1945, 6, 16, 05, 29, 21, tz = "US/Mountain") # "1945-06-16 05:29:21 MWT"
要素を取り出す
# yearを取り出す
year("1998-03-18") # 1998
# 年始から何日目か
yday("1900-10-14") # 287
# 月を取り出す
month("1857-03-27", label = TRUE) # 3
# 曜日を取り出す
wday("1890-02-17", label = TRUE) # 月
6.Time zones
デフォルトの関数を使う。
# 現在のタイムゾーンを表示する
Sys.timezone() # "Asia/Tokyo"
# 全てのタイムゾーンのリストを表示する
OlsonNames() # [1] "Africa/Abidjan" "Africa/Accra" "Africa/Addis_Ababa" ...
# locationベースのタイムゾーンでの日時を表示する
ymd_hms("1915-04-25 12:00:00", tz = "Australia/Eucla") # "1915-04-25 12:00:00 +0845"
# UTC offset timezoneの日時を表示する
ymd_hms("1915-04-25 12:00:00 +08:45") # "1915-04-25 03:15:00 UTC"
# 別のタイムゾーンの日時に変換する
with_tz(ymd_hms("1915-04-26 09:00:00", tz = "Asia/Kuala_Lumpur"), "America/Chicago")
# "1915-04-25 20:00:00 CST"
# 指定したタイムゾーンの日時を無視して、もとのタイムゾーンの日時を入れる
force_tz(ymd_hms("1915-04-26 09:00:00", tz = "Asia/Kuala_Lumpur"), "America/Chicago")
# "1915-04-26 09:00:00 CST"
7.Time intervals
Time intervals
# いろいろな時点を設定する
start <- ymd("1970-01-01")
end <- ymd("2012-12-21")
start2 <- ymd("2001-01-01")
end2 <- ymd("2019-12-21")
# 2つの時点のインターバルを計算する
interval <- interval(start, end)
# 長さを表示する
int_length(interval) # 1356048000
# かぶっている期間を表示する
interval2 <- interval(start2, end2)
intersect(interval, interval2)
# 2001-01-01 UTC--2012-12-21 UTC
Periods and durations
# 年単位で期間を指定(period)
years(2) # "2y 0m 0d 0H 0M 0S"
# 年単位で期間を指定(duration)
dyears(2) # "63115200s (~2 years)"
# うるう年(leap-year)とそうでない年の区間を作る
leap <- interval("2020-01-01", "2021-01-01")
non_leap <- interval("2021-01-01", "2022-01-01")
# 上のオブジェクトをperiodに変換する
as.period(leap) # "1y 0m 0d 0H 0M 0S"
as.period(non_leap) # "1y 0m 0d 0H 0M 0S"
# durationに変換する
as.duration(leap) # "31622400s (~1 years)"
as.duration(non_leap) # "31536000s (~52.14 weeks)"
Data arithmetic
# ある日時から今までの経過日数を計算する
today() - ymd("1990-07-15") # Time difference of 11855 days
# タイムゾーン変化前から初めて、1日追加する
ymd("2022-12-31", tz = "America/New_York") + days(1) # "2023-01-01 EST"
# durationを追加する
ymd("2022-12-01", tz = "America/New_York") + ddays(1) # "2022-12-02 EST"
#* 見本と出力結果が異なる
Rounding dates
# round dates to the nearest time units
round_date(ymd("2004-10-04", "week"))
# round dates to the previous time units
floor_date(ymd("2004-10-04", "week"))
# round dates to the next time units
ceiling_date(ymd("2004-10-04", "week"))