atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
R入門
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
R入門
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
R入門
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • R入門
  • 日付と時刻

R入門

日付と時刻

最終更新:2025年04月04日 21:19

r-intro

- view
管理者のみ編集可

目次

  • 目次
  • 日付型ベクトルの宣言と初期化
  • 現在の日時を取得する
  • 年月日(数値型)から日付型ベクトルを作成する
  • 文字列から日付を作成する
  • 書式を指定して文字列型ベクトルを日付型ベクトルに変換する
  • 日付型ベクトルから年、月、日を取り出す
  • 日付型ベクトルから年、月、日を抜き出す
  • 日時の計算を行う
  • 日付からその日の曜日を得る。
  • 同じ値を繰り返してかつ連続したベクトルを作る
  • 日付を文字列に変換する
  • 月の日数を得る
  • 日付型ベクトルから年、月、日を数値型ベクトルで取り出す
  • 文字列から時刻を作成する
  • 文字列から日付時刻を作成する
  • nか月後の日付を得る
  • n日後の日付を得る
  • n年後の日付を得る
  • スクリプト内で処理時間を計算して表示する
  • 日や時間などをしてして日付時刻型ベクトルを作成する
  • 日付時刻型ベクトルの特定の要素(年、月、日、時、分、秒)だけを修正する
  • 2つの日付から年の差を得る
  • 現在の環境のタイムゾーンを得る
  • タイムゾーンIDを一覧形式で得る
  • 日付時刻型ベクトルを作成する
  • 日付時刻型ベクトルを作成する
  • 区切り文字に.(ドット)を使った日付文字列を日付に変換する
  • 何か月後か調べる
  • ymd_hms関数で作成される日付時刻型ベクトルのタイムゾーンについて
  • 日付時刻型ベクトルの日付時刻を指定のタイムゾーンの日付時刻に変更する
  • 日付時刻型ベクトルのタイムゾーンを変更する
  • 日付のタイムゾーンを得る

日付型ベクトルの宣言と初期化

日付を扱うための変数(ベクトル)を使うには、その日付を格納する領域を用意して、それに名前を付ける必要がある。これを宣言という。

日付型変数(ベクトル)はas.Date関数に書式に従った文字列リテラルを与えることで宣言することができる。ベクトルの長さを得るにはlength関数を使う。

> dt <- as.Date(c("2001-01-01", "2001-01-03"))
> print(dt)
[1] "2001-01-01" "2001-01-03"
> length(dt)
[1] 2

現在の日時を取得する

日付だけであればSys.Date関数を、日時を得る場合はSys.time関数を使う。

> Sys.Date()
[1] "2022-06-30"
> Sys.time()
[1] "2022-06-30 23:06:14 JST"

Sys.Date関数の戻り値は日付型で、Sys.time関数の戻り値はPOSIXct型である。

> dt <- Sys.Date()
> class(dt)
[1] "Date"
> dt <- Sys.time()
> class(dt)
[1] "POSIXct" "POSIXt"

年月日(数値型)から日付型ベクトルを作成する

ISOdate関数を使う。戻り値はPOSIXct。タイムゾーンを指定しないとGMTになってしまうことに注意。タイムゾーンの情報が不要であれば、戻り値をas.Date関数に通すと通常の日付型になる。

> ISOdate(2000, 1, 24)
[1] "2000-01-24 12:00:00 GMT"
> ISOdate(2000, 1, 24, tz = "Japan")
[1] "2000-01-24 12:00:00 JST"
> class((ISOdate(2000, 1, 24)))
[1] "POSIXct" "POSIXt" 
> as.Date((ISOdate(2000, 1, 24)))
[1] "2000-01-24"

文字列から日付を作成する

as.Date関数もしくはstrptime関数を使う。as.Dateは一部の書式にしか対応しておらず、as.Date関数で対応していない書式の場合は、strptime関数を使う。

> s1 <- c("1991/02/03", "1991/2/3")
> s2 <- c("1991-02-03", "1991-2-3")
> s3 <- c("91/2/3")
> as.Date(c(s1, s2, s3))
[1] "1991-02-03" "1991-02-03" NA           NA           "0091-02-03"
> strptime(s2, "%Y-%m-%d")
[1] "1991-02-03 JST" "1991-02-03 JST"
> strptime(s3, "%y/%m/%d")
[1] "1991-02-03 JST"

%Yなどの書式文字列については、strptimeのヘルプを参照のこと。

> ?strptime

書式を指定して文字列型ベクトルを日付型ベクトルに変換する

strptime関数を使う。戻り値はPOSIXlt型(時刻とタイムゾーンを持つ日付型で、実態は秒単位の整数型)。

> s <- c("2001-02-03", "2002-04-05")
> strptime(s, "%Y-%m-%d")
[1] "2001-02-03 JST" "2002-04-05 JST"
> s <- c("2001/02/03", "2002/04/05")
> strptime(s, "%Y/%m/%d")
[1] "2001-02-03 JST" "2002-04-05 JST"
> dt <- strptime(s, "%Y/%m/%d")
> class(dt)
[1] "POSIXlt" "POSIXt"

POSIXlt型のため、時刻も扱える(タイムゾーンも)。

> s <- c("2001-02-03T12:24:56", "2002-04-05T01:02:03")
> strptime(s, "%Y-%m-%dT%H:%M:%S")
[1] "2001-02-03 12:24:56 JST" "2002-04-05 01:02:03 JST"

POSIXlt型の実態は秒単位の整数型のため、整数で演算をすると、以下のような結果になる。

> dt <- strptime(s, "%Y-%m-%dT%H:%M:%S")
> dt
[1] "2001-02-03 12:34:56 JST" "2002-04-05 01:02:03 JST"
> dt + 3
[1] "2001-02-03 12:34:59 JST" "2002-04-05 01:02:06 JST"

書式はstrptimeに書かれている。

> ?strptime

日付型ベクトルから年、月、日を取り出す

POSIXlt型ベクトルかformat関数を使う。POSIXlt型ベクトルは、日付の構成要素(年、月、日など)を簡単に取り出せる。年はyear、月はmon、日はmday。ただしyearは1900からの通算数、monは0からの通算数であることに注意。format関数は日付型ベクトルを文字型ベクトルに変換する関数だが、得られた文字列を数値型ベクトルに変換すればよい。

> today <- as.Date("2020-07-23")
> as.POSIXlt(today)$year + 1900
[1] 2020
> as.integer(format(today, "%Y"))
[1] 2020
> as.POSIXlt(today)$mon + 1
[1] 7
> as.integer(format(today, "%m"))
[1] 7
> as.POSIXlt(today)$mday
[1] 23
> as.integer(format(today, "%d"))
[1] 23

①POSIXlt型ベクトルを使う、②format関数とas.integer関数を組み合わせて使う、どちらの処理が早いかsystem.time関数で計測してみる。

> date1 <- as.Date("1000-01-01")
> date2 <- as.Date("3000-12-31")
> dateall <- seq(date1, date2, by = "day")
> length(dateall)
[1] 730850
> system.time(as.POSIXlt(dateall)$mon + 1)
   ユーザ   システム       経過  
      0.53       0.00       0.53 
> system.time(as.integer(format(dateall, "%m")))
   ユーザ   システム       経過  
      1.99       0.02       2.00

POSIXlt型ベクトルを使う①の処理が圧倒的に早いため、①の手順で行ったほうがよい。

日付型ベクトルから年、月、日を抜き出す

format関数を使う。format関数は抜き出した結果を文字型ベクトルで返すため、用途に応じてas.XXX関数を使って変換する。以下は、それぞれ年、月、日を抜き出した例。最後は抜き出した日を整数に変換している。

> dt <- c(as.Date("2000-01-03"), as.Date("2000-02-01"))
> dt
[1] "2000-01-03" "2000-02-01"
> format(dt, "%Y")
[1] "2000" "2000"
> format(dt, "%m")
[1] "01" "02"
> format(dt, "%d")
[1] "03" "01"
> as.integer(format(dt, "%m"))
[1] 1 2

日時の計算を行う

difftime関数を使う。引数に、比較をする日、基準とする日の順に日付オブジェクトを与える。unitsオプションにいろいろ与えることで、返却値の単位を指定することができる。

> dt1 <- as.Date("2002-01-02")
> dt2 <- as.Date("2002-01-05")
> difftime(dt2, dt1)
Time difference of 3 days
> difftime(dt2, dt1, units = "hours")
Time difference of 72 hours
> difftime(dt2, dt1, units = "days")
Time difference of 3 days
> difftime(dt2, dt1, units = "hours")
Time difference of 72 hours

返却値の値は計算に使用することができる。

> n <- difftime(dt2, dt1, units = "hours")
> print(n / 8)
Time difference of 9 hours

日付からその日の曜日を得る。

weekdays関数を使う。以下は2021年の4月1~3日の曜日を得る例。

> d <- seq(as.Date("2021-04-01"), length = 3, by = "1 day")
> d
[1] "2021-04-01" "2021-04-02" "2021-04-03"
> weekdays(d)
[1] "木曜日" "金曜日" "土曜日"

特定の1日であれば、以下のようにする。西暦1年1月1日の曜日は月曜日であることがわかる。

> weekdays(as.Date("0001-01-01"))
[1] "月曜日"

同じ値を繰り返してかつ連続したベクトルを作る

同じ値が連続したベクトルを作るにはrep関数を使うが、

> rep(1, 3)
[1] 1 1 1

同じ値が繰り返してかつ連続したベクトルを作るには(たとえば1,1,1,2,2,2,3,3,3,…)、rep関数にeachオプションを付けて使う。

> rep(1:3, 3)
[1] 1 2 3 1 2 3 1 2 3
> rep(1:3, 1, each = 3)
[1] 1 1 1 2 2 2 3 3 3

日付型も使える。

> dt1 <- as.Date("2022-01-01")
> dt2 <- as.Date("2022-01-03")
> rep(seq(dt1, dt2, by = "day"), 3)
[1] "2022-01-01" "2022-01-02" "2022-01-03"
[4] "2022-01-01" "2022-01-02" "2022-01-03"
[7] "2022-01-01" "2022-01-02" "2022-01-03"
> rep(seq(dt1, dt2, by = "day"), 1, each = 3)
[1] "2022-01-01" "2022-01-01" "2022-01-01"
[4] "2022-01-02" "2022-01-02" "2022-01-02"
[7] "2022-01-03" "2022-01-03" "2022-01-03"

日付を文字列に変換する

format関数を使う。format関数はベクトルを扱える。文字列に変換する書式はformatオプションを使うことができる。

> da <- as.Date(c("2014-12-01", "2014-12-31"))
> format(da)
[1] "2014-12-01" "2014-12-31"
> mode(format(da))
[1] "character"
> class(format(da))
[1] "character"
> format(da, format = "%Y/%m/%d")
[1] "2014/12/01" "2014/12/31"

月の日数を得る

lubridateパッケージのdays_in_month関数を使う。例えば、2000年2月の日数(この年は閏年のため29)、2022年8月の日数(31)を求める。

> library(lubridate)
> dt <- as.Date(c("2000-02-01", "2022-08-01"))
> days_in_month(dt)
Feb Aug 
 29  31 
> typeof(days_in_month(dt))
[1] "integer"

HmiscパッケージのmonthDays関数も使える。

> library(Hmisc)
> dt <- as.Date(c("2000-02-01", "2022-08-01"))
> monthDays(dt)
[1] 29 31
> typeof(monthDays(dt))
[1] "integer"

日付型ベクトルから年、月、日を数値型ベクトルで取り出す

lubridateパッケージのyear,month,day関数を使う。

> library(lubridate)
> dt <- seq(as.Date("2022-11-02"), as.Date("2023-02-02"), by = "month")
> print(dt)
[1] "2022-11-02" "2022-12-02" "2023-01-02" "2023-02-02"
> print(year(dt))
[1] 2022 2022 2023 2023
> print(month(dt))
[1] 11 12  1  2
> print(day(dt))
[1] 2 2 2 2

同様に時分秒を取り出すためのhour,minute,second関数もあるが、日付型ベクトル(as.Date)の場合は0が戻る。

> print(hour(dt))
[1] 0 0 0 0
> print(minute(dt))
[1] 0 0 0 0
> print(second(dt))
[1] 0 0 0 0

文字列から時刻を作成する

strptime関数を使う。Rには時刻型というベクトル(変数)はなく、日付とワンセットであるため、時刻だけを扱おうとすると、自動的にその日の日付として処理されてしまうことに注意。

> Sys.time()
[1] "2023-06-27 23:37:26 JST"
> strptime(c("12", "34"), "%S")
[1] "2023-06-27 00:00:12 JST" "2023-06-27 00:00:34 JST"
> strptime(c("12:34", "34:56"), "%M:%S")
[1] "2023-06-27 00:12:34 JST" "2023-06-27 00:34:56 JST"
> strptime(c("12:34:56", "22:34:56"), "%H:%M:%S")
[1] "2023-06-27 12:34:56 JST" "2023-06-27 22:34:56 JST"

文字列から日付時刻を作成する

strptime関数を使う。

> strptime(c("2001/02/03 12:34:56", "2012/03/04 01:02:03"), "%Y/%m/%d %H:%M:%S")
[1] "2001-02-03 12:34:56 JST" "2012-03-04 01:02:03 JST"

日付時刻の書式を指定する書式文字列については、strptime関数のヘルプに詳しい。

> ?strptime

nか月後の日付を得る

lubridateパッケージのmonths関数を使う。引数には加算(減算)したい月数を整数で指定する。引数に「1」を指定すれば翌月、「-1」を指定すれば前月の日付を返す。

ymdはlubridateパッケージに含まれる、文字列から日付を得る関数。months関数の引数にベクトルを指定すれば、ベクトル単位で計算を行う。

> library(lubridate)
> da <- ymd("2000-12-23", "2123-04-05") 
> print(da)
[1] "2000-12-23" "2123-04-05"
> da <- da + months(1)
> print(da)
[1] "2001-01-23" "2123-05-05"
> da <- da + months(-2)
> print(da)
[1] "2000-11-23" "2123-03-05"
> da <- da + months(12)
> print(da)
[1] "2001-11-23" "2124-03-05"
> ymd("2000-12-23") + months(2:3)
[1] "2001-02-23" "2001-03-23"
> ymd("2000-12-23", "2010-12-23") + months(2:3)
[1] "2001-02-23" "2011-03-23"

n日後の日付を得る

lubridateパッケージのdays関数を使う。引数には加算(減算)したい日数を整数で指定する。引数に「1」を指定すれば翌日、「-1」を指定すれば前日の日付を返す。

ymdはlubridateパッケージに含まれる、文字列から日付を得る関数。days関数の引数にベクトルを指定すれば、ベクトル単位で計算を行う。

> library(lubridate)
> da <- ymd("2000-12-23", "2123-04-05") 
> print(da)
[1] "2000-12-23" "2123-04-05"
> da <- da + days(2)
> print(da)
[1] "2000-12-25" "2123-04-07"
> da <- da + days(-5)
> print(da)
[1] "2000-12-20" "2123-04-02"
> da <- da + days(365)
> print(da)
[1] "2001-12-20" "2124-04-01"
> ymd("2000-12-23") + days(2:3)
[1] "2000-12-25" "2000-12-26"
> ymd("2000-12-23", "2010-12-23") + days(2:3)
[1] "2000-12-25" "2010-12-26"

n年後の日付を得る

lubridateパッケージのyears関数を使う。引数には加算(減算)したい月数を整数で指定する。引数に「1」を指定すれば翌年、「-1」を指定すれば前年の日付を返す。

ymdはlubridateパッケージに含まれる、文字列から日付を得る関数。years関数の引数にベクトルを指定すれば、ベクトル単位で計算を行う。

> library(lubridate)
> da <- ymd("2000-12-23", "2123-04-05") 
> da <- da + years(1)
> print(da)
[1] "2001-12-23" "2124-04-05"
> da <- da + years(-2)
> print(da)
[1] "1999-12-23" "2122-04-05"
> ymd("2000-12-23") + years(2:3)
[1] "2002-12-23" "2003-12-23"
> ymd("2000-12-23", "2010-12-23") + years(2:3)
[1] "2002-12-23" "2013-12-23"

スクリプト内で処理時間を計算して表示する

開始時と終了時にそれぞれSys.time関数で現在の日時を取得し、最後にdifftime関数でその差を計算して表示すればよい。以下をスクリプトファイルdifftime.Rに保存をして、実行してみる。途中にSys.sleep関数を使用して意図的に3秒間処理を止めている。

dtibegin <- Sys.time()
Sys.sleep(3)
dtiend <- Sys.time()
d <- difftime(dtiend, dtibegin, units = "secs")
cat(sprintf("処理時間: %.2f秒\n", d))

実行結果

> source("difftime.R")
処理時間: 3.07秒

日や時間などをしてして日付時刻型ベクトルを作成する

lubridateパッケージのymd_hms関数を使う。年、月、日、時、分、秒をすべて指定する必要がある。tzオプションにタイムゾーンの情報も適切に指定する必要がある。指定しないとUTCの日付時刻を作成する。

> library(lubridate)
> dttm <- ymd_hms("2012-12-31")
 警告メッセージ: 
All formats failed to parse. No formats found. 
> dttm <- ymd_hms("2012-12-31 12:34:56")
> print(dttm)
[1] "2012-12-31 12:34:56 UTC"
> dttm <- ymd_hms("2012-12-31 12:34:56", "2034-01-02 23:45:12")
> print(dttm)
[1] "2012-12-31 12:34:56 UTC" "2034-01-02 23:45:12 UTC"
> dttm <- ymd_hms("2012-12-31 12:34:56", "2034-01-02 23:45:12", tz = "Japan")
> print(dttm)
[1] "2012-12-31 12:34:56 JST" "2034-01-02 23:45:12 JST"
> dttm <- ymd_hms("2012-12-31 12:34:56", "2034-01-02 23:45", tz = "Japan")
 警告メッセージ: 
 1 failed to parse. 
> typeof(dttm)
[1] "double"
> class(dttm)
[1] "POSIXct" "POSIXt" 
> mode(dttm)
[1] "numeric"

日付時刻型ベクトルの特定の要素(年、月、日、時、分、秒)だけを修正する

lubridateパッケージのupdate関数を使う。

> library(lubridate)
> dttm <- ymd_hms("2012-12-31 12:34:56", "2034-01-02 23:45:12", tz = "Japan")
> print(dttm)
[1] "2012-12-31 12:34:56 JST" "2034-01-02 23:45:12 JST"
> update(dttm, month = 3)
[1] "2012-03-31 12:34:56 JST" "2034-03-02 23:45:12 JST"
> update(dttm, hour = 7)
[1] "2012-12-31 07:34:56 JST" "2034-01-02 07:45:12 JST"

2つの日付から年の差を得る

簡単に求めるには、以下のようにseq関数とlength関数を組み合わせればよい。差が1年未満であれば0、1年~2年未満であれば1、…が得られる。

> length(seq(as.Date("2020-02-15"), as.Date("2020-02-15"), by = "year")) - 1
[1] 0
> length(seq(as.Date("2020-02-15"), as.Date("2020-02-16"), by = "year")) - 1
[1] 0
> length(seq(as.Date("2020-02-15"), as.Date("2021-02-14"), by = "year")) - 1
[1] 0
> length(seq(as.Date("2020-02-15"), as.Date("2021-02-15"), by = "year")) - 1
[1] 1
> length(seq(as.Date("2020-02-15"), as.Date("2021-02-16"), by = "year")) - 1
[1] 1
> length(seq(as.Date("2020-02-15"), as.Date("2031-02-14"), by = "year")) - 1
[1] 10
> length(seq(as.Date("2020-02-15"), as.Date("2031-02-15"), by = "year")) - 1
[1] 11
> length(seq(as.Date("2020-02-15"), as.Date("2031-02-16"), by = "year")) - 1
[1] 11

現在の環境のタイムゾーンを得る

Sys.timezone関数を使う。以下は、Windowsの日本語版バージョン4.3.1で実行した例。

> Sys.timezone()
[1] "Asia/Tokyo"

タイムゾーンIDを一覧形式で得る

その環境下に搭載されているタイムゾーンを識別するID(タイムゾーンID)を一覧形式で得るには、OlsonNames関数を使う。

> OlsonNames()
  [1] "Africa/Abidjan"                   "Africa/Accra"                    
  [3] "Africa/Addis_Ababa"               "Africa/Algiers"                  
  [5] "Africa/Asmara"                    "Africa/Asmera"    
(以下、表示省略)
> grep("Tokyo", OlsonNames())
[1] 322
> grep("Tokyo", OlsonNames(), value = TRUE)
[1] "Asia/Tokyo"

日付時刻型ベクトルを作成する

as.POSIXct関数を使うと、文字列から簡単に日付時刻型ベクトルを作ることができる。format関数を使うと、第1引数に与えた日付時刻型ベクトルから文字列型ベクトルを作ることができる。その際の出力は、加工することができる。

> as.POSIXct("2001-12-23 12:34:56")
[1] "2001-12-23 12:34:56 JST"
> dtm <- as.POSIXct("2001-12-23 12:34:56")
> mode(dtm)
[1] "numeric"
> class(dtm)
[1] "POSIXct" "POSIXt" 
> format(dtm, "%Y/%m/%d %H時%M分%S秒 %Z")
[1] "2001/12/23 12時34分56秒 JST"
> dtm <- as.POSIXct(c("2001-12-23 12:34:56", "2002-02-23 23:45:12"))
> dtm
[1] "2001-12-23 12:34:56 JST" "2002-02-23 23:45:12 JST"
> format(dtm, "%Y/%m/%d %H時%M分%S秒")
[1] "2001/12/23 12時34分56秒" "2002/02/23 23時45分12秒"

日付時刻型ベクトルを作成する

readrパッケージのparse_datetime関数を使うと、文字列から簡単に日付時刻型ベクトルを作ることができる。ただし、その際はタイムゾーンを指定する必要がある。。format関数を使うと、第1引数に与えた日付時刻型ベクトルから文字列型ベクトルを作ることができる。その際の出力は、加工することができる。

> library(readr)
> parse_datetime("2001-12-23 12:34:56")
[1] "2001-12-23 12:34:56 UTC"
> Sys.timezone()
[1] "Asia/Tokyo"
> parse_datetime("2001-12-23 12:34:56", locale = locale(tz = "Asia/Tokyo"))
[1] "2001-12-23 12:34:56 JST"
> dtm <- parse_datetime("2001-12-23 12:34:56", locale = locale(tz = "Asia/Tokyo"))
> mode(dtm)
[1] "numeric"
> class(dtm)
[1] "POSIXct" "POSIXt" 
> format(dtm, "%Y/%m/%d %H時%M分%S秒 %Z")
[1] "2001/12/23 12時34分56秒 JST"
> dtm <- parse_datetime(c("2001-12-23 12:34:56", "2002-02-23 23:45:12"), locale = locale(tz = "Asia/Tokyo"))
> dtm
[1] "2001-12-23 12:34:56 JST" "2002-02-23 23:45:12 JST"
> format(dtm, "%Y/%m/%d %H時%M分%S秒 %Z")
[1] "2001/12/23 12時34分56秒 JST" "2002/02/23 23時45分12秒 JST"

区切り文字に.(ドット)を使った日付文字列を日付に変換する

as.Date関数もstrptime関数もデフォルトでは区切り文字に.(ドット)を使うことはできない。formatオプションに書式を指定すればよい。lubridateパッケージのymd関数はデフォルトの状態で変換することができる。

> s <- c("2001.2.3", "2012.3.4", "2123.4.5")
> as.Date(s)
 charToDate(x) でエラー: 
   文字列は標準的な曖昧さのない書式にはなっていません 
> as.Date(s, format = "%Y.%m.%d")
[1] "2001-02-03" "2012-03-04" "2123-04-05"
> strptime(s)
 strptime(s) でエラー: 
   引数 "format" がありませんし、省略時既定値もありません 
> strptime(s, format = "%Y.%m.%d")
[1] "2001-02-03 JST" "2012-03-04 JST" "2123-04-05 JST"
> lubridate::ymd(s)
[1] "2001-02-03" "2012-03-04" "2123-04-05"

何か月後か調べる

seq関数とlength関数を組み合わせれば計算できる。以下の例では2024年1月16日を基準にして何か月後か調べた例。

> da <- as.Date("2024-01-16")
> length(seq(da, as.Date("2024-01-25"), by = "month")) - 1
[1] 0
> length(seq(da, as.Date("2024-02-25"), by = "month")) - 1
[1] 1
> length(seq(da, as.Date("2024-03-25"), by = "month")) - 1
[1] 2
> length(seq(da, as.Date("2025-03-25"), by = "month")) - 1
[1] 14

ymd_hms関数で作成される日付時刻型ベクトルのタイムゾーンについて

実行環境如何に関わらず作成時にタイムゾーン(等時帯)を明示的に指定をしなければ、UTC(協定世界時)の日付時刻が作成されるので注意。この場合、文字列で指定した時刻がUTCに変換されるわけではなく、指定した文字列のUTCが作成されてしまう。JST(日本標準時)で作成したければ、タイムゾーンを適切に指定すること。

> Sys.timezone()
[1] "Asia/Tokyo"
> dttm <- ymd_hms(c("2001-02-03T04:05:06", "2010-11-12T13:14:15"))
> print(dttm)
[1] "2001-02-03 04:05:06 UTC" "2010-11-12 13:14:15 UTC"
> dttm <- ymd_hms("2001-02-03T04:05:06", tz = Sys.timezone())
> print(dttm)
[1] "2001-02-03 04:05:06 JST"

日付時刻型ベクトルの日付時刻を指定のタイムゾーンの日付時刻に変更する

with_tz関数を使う。指定の日付時刻を指定のタイムゾーンに応じて時刻を変換する。

以下の例では、タイムゾーンが日本標準時(JST)の日付時刻を太平洋標準時(PST)に変換した例。JSTとPSTの時差は17時間(PST+17=JST)のため、PSTに変換した日付時刻が17時間戻っていることが分かる。

例えば、読み込むときに日付はそのままに誤ってUTCとして読み込んでしまった場合などにJSTであると強制的に書き換える場合などに使える。

> library(lubridate)
> dttm1 <- ymd_hms("2001-02-03 04:05:06", tz = "Asia/Tokyo")
> print(dttm1)
[1] "2001-02-03 04:05:06 JST"
> dttm2 <- with_tz(dttm1, tz = "America/Los_Angeles")
> print(dttm2)
[1] "2001-02-02 11:05:06 PST"

日付時刻を変換するのではなくタイムゾーンの情報を変更する場合は、force_tz関数を使う。

日付時刻型ベクトルのタイムゾーンを変更する

force_tz関数を使う。指定のタイムゾーンに応じて時刻を変換するのではなく、ベクトルに保存されているタイムゾーンの情報だけを強制的に書き換えることに注意。

例えば、読み込むときに日付はそのままに誤ってUTCとして読み込んでしまった場合などにJSTであると強制的に書き換える場合などに使える。

> library(lubridate)
> Sys.timezone()
[1] "Asia/Tokyo"
> dttm <- ymd_hms("2001-02-03 04:05:06")
> print(dttm)
[1] "2001-02-03 04:05:06 UTC"
> dttm <- force_tz(dttm, tzone = Sys.timezone())
> print(dttm)
[1] "2001-02-03 04:05:06 JST"

タイムゾーンの情報を変えるのではなく日付時刻を指定のタイムゾーンに変換する場合は、with_tz関数を使う。

日付のタイムゾーンを得る

lubridateパッケージのtz関数を使う。

> library(lubridate)
> da <- ymd("2012-03-04", tz = "Asia/Tokyo")
> print(da)
[1] "2012-03-04 JST"
> tz(da)
[1] "Asia/Tokyo"
> da <- ymd("2012-03-04", tz = "US/Pacific")
> print(da)
[1] "2012-03-04 PST"
> tz(da)
[1] "US/Pacific"

以下の例のとおり、Rの動作環境から得られる日付時刻はタイムゾーンの情報を持たないことに注意。持たないイコールUTCになる。

> Sys.timezone()
[1] "Asia/Tokyo"
> da <- Sys.Date()
> print(da)
[1] "2024-11-23"
> tz(da)
[1] "UTC"
> dttm <- Sys.time()
> print(dttm)
[1] "2024-11-23 23:48:33 JST"
> tz(dttm)
[1] ""
「日付と時刻」をウィキ内検索
LINE
シェア
Tweet
R入門
記事メニュー

メニュー

  • トップページ
  • Rとは
  • Rを使ってみる
  • 画面出力と入力
  • 変数とオブジェクト
  • ベクトル
  • 演算子と制御構文
  • 数と式
  • 文字と文字列
  • 正規表現
  • 日付と時刻
  • データフレーム
  • tidyverse
  • リスト
  • ファイルの入出力
  • ファイル・ディレクトリ
  • 実行とデバッグ
  • 数学
  • 行列
  • 関数
  • 統計学
  • 統計解析
  • 数値計算
  • 応用
  • 時系列解析
  • 地理空間情報
  • Rの操作
  • データベース
  • パッケージ

  • 環境
  • インターネット
  • 作図
  • 画像

  • 本の計算を再現
  • セイバーメトリクス
  • その他


ここを編集
記事メニュー2

更新履歴

取得中です。

ここを編集
人気記事ランキング
  1. その他
  2. リスト
  3. 日付と時刻
  4. 地理空間情報
  5. ファイル・ディレクトリ
  6. Rによるセイバーメトリクス入門(技術評論社)
  7. 数学
  8. セイバーメトリクス
もっと見る
最近更新されたページ
  • 1日前

    リスト
  • 6日前

    行列
  • 9日前

    tidyverse
  • 47日前

    インターネット
  • 58日前

    日付と時刻
  • 58日前

    応用
  • 58日前

    文字と文字列
  • 75日前

    変数とオブジェクト
  • 118日前

    その他
  • 119日前

    画像
もっと見る
人気記事ランキング
  1. その他
  2. リスト
  3. 日付と時刻
  4. 地理空間情報
  5. ファイル・ディレクトリ
  6. Rによるセイバーメトリクス入門(技術評論社)
  7. 数学
  8. セイバーメトリクス
もっと見る
最近更新されたページ
  • 1日前

    リスト
  • 6日前

    行列
  • 9日前

    tidyverse
  • 47日前

    インターネット
  • 58日前

    日付と時刻
  • 58日前

    応用
  • 58日前

    文字と文字列
  • 75日前

    変数とオブジェクト
  • 118日前

    その他
  • 119日前

    画像
もっと見る
ウィキ募集バナー
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. R.E.P.O. 日本語解説Wiki
  2. シュガードール情報まとめウィキ
  3. SYNDUALITY Echo of Ada 攻略 ウィキ
  4. ガンダムGQuuuuuuX 乃木坂46部@wiki
  5. ありふれた職業で世界最強 リベリオンソウル @ ウィキ
  6. ドタバタ王子くん攻略サイト
  7. パズル&コンクエスト(Puzzles&Conquest)攻略Wiki
  8. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  9. Merge Cooking 攻略 @ ウィキ
  10. アサシンクリードシャドウズ@ ウィキ
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 初音ミク Wiki
  5. 検索してはいけない言葉 @ ウィキ
  6. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
  7. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  8. 発車メロディーwiki
  9. SDガンダム ジージェネレーションクロスレイズ 攻略Wiki
  10. 鬼レンチャンWiki
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  2. 参加者一覧 - ストグラ まとめ @ウィキ
  3. ロスサントス警察 - ストグラ まとめ @ウィキ
  4. 仄々山 すごす - ストグラ まとめ @ウィキ
  5. ロスサントス救急救命隊 - ストグラ まとめ @ウィキ
  6. ボイラ テンガリン - ストグラ まとめ @ウィキ
  7. キラ・メキーラ - ストグラ まとめ @ウィキ
  8. 無馬 かな - ストグラ まとめ @ウィキ
  9. 没作品 - アニヲタWiki(仮)
  10. 一夫多妻/ハーレム - アニヲタWiki(仮)
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.