13章 lubridateによる日付と時刻

13.0 ライブラリの読み込み

library("tidyverse")

library("lubridate")

library("nycflights13")

この章で利用するデータです。

make_datetime_100 <- function(year, month, day, time) {
  make_datetime(year, month, day, time %/% 100, time %% 100)
}

flights_dt <- flights %>%
  filter(!is.na(dep_time), !is.na(arr_time)) %>%
  mutate(
    dep_time = make_datetime_100(year, month, day, dep_time),
    arr_time = make_datetime_100(year, month, day, arr_time),
    sched_dep_time = make_datetime_100(year, month, day, sched_dep_time),
    sched_arr_time = make_datetime_100(year, month, day, sched_arr_time)) %>%
  select(origin, dest, ends_with("delay"), ends_with("time"))

sched_dep <- flights_dt %>%
    mutate(minute = minute(sched_dep_time)) %>%
    group_by(minute) %>%
    summarise(
      avg_delay = mean(arr_delay, na.rm = TRUE),
      n = n())

13.1 はじめに

練習問題はありません。

13.2 日付と時刻の作成

練習問題1 不適切な日付を含む文字列をパースした場合はどうなるか?

NAとして変換されます。

練習問題2 today()tzoneはどんな役割があるのか。それは重要なのか?

タイムゾーンによって返される値は異なります。

練習問題3 適切なlubridate関数で下記の日付をパースしなさい。

lubridateの関数はYear, Month, Dayの頭文字をパースしたい文字列の規則に当てはめるだけで、日付型に変換できる便利な関数が用意されています。

13.3 日付時刻の要素

練習問題1 1日のフライト時刻の分布は、1年間を通じてどのように変わったか?

月ごとにプロットしてみると、2月のフライト回数が減っているだけで、目立った傾向はありません。また、2月は日数が少ないからかもしれません。

密度に変えてみたところ、日数が少ない2月については、日数が少なかっただけだったということがわかります。

練習問題2 dep_timesched_dep_timeおよびdep_delayを比較しなさい。一貫した変化はあるのか。

一致はしていないが、これは日付がずれることで発生するレコードかもしれません。make_datetime_100()関数を使用して日時を作成するときに、これは考慮されていません。

練習問題3 air_timeを出発から到着までの時間差を比較しなさい。

一致はしていない。

練習問題4 平均遅延時間は1日の間にどのように変わりますか?dep_timeまたはsched_dep_timeのいずれを使うべきなのか?

dep_timeはフライトを遅らせると、それが積み重なって、遅延時間が大きくなる傾向がわかります。実際、視覚化するとこの関係が説明できます。

dep_timeはフライトを遅らせると時間が遅れますが、sched_dep_timeは、フライトをスケジュールする人にとって重要な指標なので、こちらを使います。

練習問題5 遅延の可能性を最小限に抑えたい場合は、何曜日に出発すべきか。

土曜日は平均出発遅延時間が少ないようです。遅延の可能性を下げたいのであれば、土曜日にフライトするべきです。

練習問題6 diamonds$caratflights$sched_dep_timeの分布が似ているのはなぜか?

分布が似ているのは、ある閾値を設定し、その点を超えると、繰りあげ処理が行なわれているようです。そのため、双方の分布が似てきます。

練習問題7 20〜30分および50〜60分でのフライトは出発遅延が少ない。それよりも早く出発する便による影響という私の仮説を確認しなさい。

出発の分数ごとにフライトをグループ化すると、早い出発の割合が20〜30、50〜60分の間で最も高いことがわかります。

13.4 タイムスパン

練習問題1 months()があるのにdmonths()がないのはなぜか。

d**()durationを表す関数です。月の日数が異なるため、秒単位の値は定まりません。

  • 31日:1月、3月、5月、7月、8月、10月

  • 30日:4月、6月、9月、11月、12月

  • 28または29日:2月

練習問題2 Rを学び始めたばかりの人にdays(overnight * 1)を説明しなさい。

このように夜間フライトの場合、dep_timeよりもarr_timeのほうが早くなります。夜間飛行の場合、日付のカウントは+1日されていないようです。

overnightというTRUEFALSEをとるフラグを作成し、TRUEの場合は+1日することでこの問題を解決します。

練習問題3 2015年の毎月の最初の日を示す日付のベクトルを作成しなさい。また、今年の毎月の最初の日を示す日付のベクトルを作成します。

基準日を作成し、それに1月ごとに足していけば作成できます。months(1:12)にすると、2月はじまりで翌年の1月終わりのベクトルになるので注意してください。

今年の日付ベクトルが必要な場合は、floor_date(today(), unit = "year")として丸めて、ベクトルの足し算を実行します。

練習問題4 誕生日(日付として)を与えて、何歳かを年数で返す関数を書きなさい。

物理的な時間量がほしいのであればdurationを使い、人間の感覚を表現したいならperiodを使い、タイムスパンを表す場合はintervalを使います。intervalは開始時点付きのdurationです。

練習問題5 (today() %--% (today() + years(1)) / months(1)はなぜうまく動かないのか。

括弧が足りていません。

13.5 タイムゾーン

練習問題はありません。

最終更新

役に立ちましたか?