Дата и время

Задание 1

Используя функции базового пакета, выведите: а) текущую дату, б) текущие дату и время, в) таймзону локали сессии.

## [1] "2022-02-12"
## [1] "2022-02-12 22:57:12 UTC"
## [1] "Etc/UTC"

Задание 2

Преобразуйте в дату строку 2020-01-01 и проверьте класс объекта.

x <- as.Date('2020-01-01')
class(x)
## [1] "Date"

Задание 3

Преобразуйте в unix-таймстамп текущую дату.

as.POSIXct(Sys.Date(), origin = '1970-01-01')
## [1] "2022-02-12 UTC"

Задание 4

Преобразуйте в unix-таймстамп текущую дату и время.

Функция Sys.time() возвращает объект классов POSIXct и POSIXt, т. е., количество дней и секунд c 1970-01-01, приведенные к особому формату. Поэтому можно просто преобразовать объект в число или просто снять класс (unclass()).

# фиксируем текущее время и дату
my_dt <- Sys.time()
my_dt
## [1] "2022-02-12 22:57:12 UTC"
# преобразование в числовой тип
x <- as.numeric(my_dt)
x
## [1] 1644706633
# снятие класса
unclass(my_dt)
## [1] 1644706633

Задание 5

Преобразуйте unix-таймстамп, полученный в предыдущем задании, обратно в время и дату, в таймзоне UTC.

as.POSIXct(x, origin = '1970-01-01', tz = 'UTC')
## [1] "2022-02-12 22:57:12 UTC"

Задание 6

Отформатируйте вывод функции Sys.time() до вида dd/mm/YYYY.

## [1] "2022-02-12 22:57:12 UTC"
strftime(Sys.time(), '%d/%m/%Y')
## [1] "12/02/2022"

Задание 7

Превратите строку 9.13.2020 в объект даты класса POSIXct/POSIXlt. Сделайте это средствами базового R, а также средствами пакета lubridate.

# базовое решение
strptime('9.13.2020', '%m.%d.%Y')
## [1] "2020-09-13 UTC"
as.Date('9.13.2020', '%m.%d.%Y')
## [1] "2020-09-13"
# решение с помощью пакета lubridate
lubridate::mdy('9.13.2020')
## [1] "2020-09-13"

Задание 8

Превратите строку 9.13.2020 12:20:15 в объект даты и времени класса POSIXct/POSIXlt. Сделайте это средствами базового R, а также средствами пакета lubridate.

# базовое решение
strptime('9.13.2020 12:20:15', '%m.%d.%Y %H:%M:%S')
## [1] "2020-09-13 12:20:15 UTC"
# решение с помощью пакета lubridate
lubridate::mdy_hms('9.13.2020 12:20:15')
## [1] "2020-09-13 12:20:15 UTC"

Задание 9

Вычислите, какой день недели был 1 января 2000 года.

strftime('2000-01-01', format = '%A')
## [1] "Saturday"

Задание 10

Вычислите, какая дата была 100 дней назад от текущей даты.

Так как объект, возвращаемый Sys.Date() - это формат POSIXct, то есть количество дней с 1970-01-01, с ним можно совершать базовые операции сложения и вычитания.

Sys.Date() - 100
## [1] "2021-11-04"

Задание 11

Постройте вектор дат от 1 января 2020 года до 9 января 2020 года, с шагом 2.

seq(as.Date('2020-01-01'), as.Date('2020-01-09'), 2)
## [1] "2020-01-01" "2020-01-03" "2020-01-05" "2020-01-07" "2020-01-09"

Задание 12

Посчитайте, сколько прошло секунд до текущей даты с 2020-01-01.

Можно воспользоваться простым вычитанием дат, и количество дней умножить на 606024 (количество секунд в сутках). Попутно надо результат вычитания (класса difftime) преобразовать в число.

as.numeric(Sys.Date() - as.Date('2020-01-01')) * 86400
## [1] 66787200

Точно так же можно воспользоваться базовой функцией difftime() и указать единицу измерения секунды, результат будет класса difftime.

difftime(Sys.Date(), as.Date('2020-01-01'), units = 'sec')
## Time difference of 66787200 secs

Задание 13

Определите номер недели на даты '2020-01-01' и '2018-01-01'. Используйте для этого базовые функции, и, параллельно, функции пакета lubridate.

Подсчет номера недели может зависеть от используемого стандарта. Так, в стандарте ISO 8601 первая неделя года -- если минимум четыре дня года приходится на эту неделю (год начался с понедельника по четверг). Если меньше трех дней, то эта неделя считается последней (53) неделей предыдущего года. В UK-формате есть нулевая неделя, а первая неделя -- это первая полная неделя, начинающаяся с понедельника. В 2020 году эти стандарты не совпадают.

# UK convention
strftime(as.Date('2020-01-01'), '%W')
## [1] "00"
# ISO week
strftime(as.Date('2020-01-01'), '%V')
## [1] "01"
lubridate::isoweek('2020-01-01')
## [1] 1
# Для сравнения 2018 год, когда неделя началась с понедельника.
# UK convention
strftime(as.Date('2018-01-01'), '%W')
## [1] "01"
# ISO week
strftime(as.Date('2018-01-01'), '%V')
## [1] "01"
lubridate::isoweek('2018-01-01')
## [1] 1

Задание 14

Используя функции пакета lubridate, найдите дату начала недели (понедельника) для даты '2020-01-17'.

lubridate::floor_date(as.Date('2020-01-17'), unit = 'week', week_start = 1)
## [1] "2020-01-13"

Задание 15

Используя функции пакета lubridate определите, является ли текущий год високосным.

lubridate::leap_year(Sys.Date())
## [1] FALSE