[[dplyr]] の `mutate()` と [[lubridate]] の `make_datetime()` を組み合わせることで、年・月・日・時・分・秒の個々の数値要素から日時オブジェクトを効率的に作成できる。
この手法は、[[Base R]] の `ISOdatetime()` の高速な代替手段として設計されており、データフレーム内の複数の列から日時を組み立てる際に特に有用である。
```r
flights |>
mutate(
flight_date = make_datetime(year, month, day, hour, minute),
.keep = "used"
)
```
```
# A tibble: 336,776 × 6
year month day hour minute flight_date
<int> <int> <int> <dbl> <dbl> <dttm>
1 2013 1 1 5 15 2013-01-01 05:15:00
2 2013 1 1 5 29 2013-01-01 05:29:00
3 2013 1 1 5 40 2013-01-01 05:40:00
4 2013 1 1 5 45 2013-01-01 05:45:00
5 2013 1 1 6 0 2013-01-01 06:00:00
6 2013 1 1 5 58 2013-01-01 05:58:00
7 2013 1 1 6 0 2013-01-01 06:00:00
8 2013 1 1 6 0 2013-01-01 06:00:00
9 2013 1 1 6 0 2013-01-01 06:00:00
10 2013 1 1 6 0 2013-01-01 06:00:00
# ℹ 336,766 more rows
# ℹ Use `print(n = ...)` to see more rows
```
## タイムゾーンを指定して日時列を作成する
`tz` 引数でタイムゾーンを指定できる。デフォルトは UTC である。
```r
flights |>
mutate(
flight_date = make_datetime(year, month, day, hour, minute, tz = "Asia/Tokyo"),
time_zone = tz(flight_date),
.keep = "used"
)
```
```
# A tibble: 336,776 × 7
year month day hour minute flight_date time_zone
<int> <int> <int> <dbl> <dbl> <dttm> <chr>
1 2013 1 1 5 15 2013-01-01 05:15:00 Asia/Tokyo
2 2013 1 1 5 29 2013-01-01 05:29:00 Asia/Tokyo
3 2013 1 1 5 40 2013-01-01 05:40:00 Asia/Tokyo
4 2013 1 1 5 45 2013-01-01 05:45:00 Asia/Tokyo
5 2013 1 1 6 0 2013-01-01 06:00:00 Asia/Tokyo
6 2013 1 1 5 58 2013-01-01 05:58:00 Asia/Tokyo
7 2013 1 1 6 0 2013-01-01 06:00:00 Asia/Tokyo
8 2013 1 1 6 0 2013-01-01 06:00:00 Asia/Tokyo
9 2013 1 1 6 0 2013-01-01 06:00:00 Asia/Tokyo
10 2013 1 1 6 0 2013-01-01 06:00:00 Asia/Tokyo
# ℹ 336,766 more rows
# ℹ Use `print(n = ...)` to see more rows
```
## 関連ノート
- **[深掘り]** [[lubridate と Base R では日時のデフォルトタイムゾーンが異なる]]: 本ノートで触れた「`tz` のデフォルトは UTC」という挙動を Base R との対比で詳しく扱う
- **[対比]** [[dplyr の mutate() と lubridate の make_date() で日付列を作成する]]: 本ノートの日時版と対になる姉妹関数
- **[派生]** [[dplyr の mutate() で関与または作成された列のみを保持する]]: 日時作成に使った複数の数値列だけを残すときに併用する
- **[派生]** [[dplyr の mutate() で作成した列は、同一の mutate() 内で即座に利用できる]]: 日時列を起点にタイムゾーン列を追加するなど、連鎖的な列作成で使える