見出し画像

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


この記事が気に入ったらサポートをしてみませんか?