Даты и время являются весьма непростыми объектами: Далее тезисно приведены отдельные моменты, которые редко высвечиваются в документации, а также трюки, которые позволяют писать быстрый и контролируемый код. Совсем краткое резюме для смартфоночиталей: на больших объемах данных используем только POSIXct с дробными долями секунд. Будет хорошо, понятно, быстро. Является продолжением серии предыдущих публикаций. ISO 8601 Data elements and interchange formats – Information interchange – Representation of dates and times is an international standard covering the exchange of date- and time-related data. Нестандартный формат даты при инициализации должен специфицироваться специально В R применяются два базовых типа времени: POSIXct и POSIXlt.
Внешние представления POSIXct и POSIXlt выглядят похожими. А внутренние? Сразу делаем заключение, что для серьезной работы с данными (более 10 строк с временем), про POSIXlt забываем как про страшный сон. Это сложная структура с безумными накладными расходами. POSIXct по своей сути является оберткой для unixtimestamp, количество секунд (миллисекунд) с некоей нулевой точки (обычно за 0 полагают 01.01.1970). Делаем ставку в работе именно на него. Полезный инструмент — online преобразование времени в unixtimestamp: Корни вопроса идут от типовой задачи анализа логов. Для быстрых событий недостаточно секундного разрешения и тут появляются вариации. Время в логе может фиксироваться: Объекты класса POSIXct могут хранить и проводить вычисления с дробными секундами, но по умолчанию при выводе на печать дробные части округляются из-за чего могут возникнуть надуманные ограничения. Проверяем и смотрим: Вернемся к логам, сформируем тестовый набор данных и посмотрим на различные варианты работы со временем.   Парсинг данных с миллисекундами. Магия lubridate  А что делать, если время может поступать в частично обрезанном формате? Разрешим вариативность определенной глубины Пробуем провести конвертацию Что делать? Вариант, конечно, ужасен, но что-то можно поделать.   Еще пакеты на "посмотреть" и поизучать: А теперь более сложный пример — добавляем месяцы Есть выход. Но операции не коммутативны, это надо помнить. Что делать, если у нас есть только время, а даты не указаны? Не проблема, нам поможет пакет hms. Такие данные представляются как периоды. Одна из больших засад при работе с временнЫми данными в БД — неизвестность или неполная осведомленность о механике и логике работы конкретных таблиц. Не всегда есть возможность посмотреть запросы по которым они строились или же текст функций.
В современных БД (далее будем подразумевать Clickhouse) время, как правило, хранится как unixtimestamp в UTC. Ну или возможны иные варианты, но все они крутятся вокруг количества единиц времени относительно некоей реперной точки. Потенциальные сложности и засады: В общем, вероятность получить предсказуемый результат в любой произвольной среде исполнения близок к 0. Чтобы избежать этого и параллельно получить еще массу преимуществ достаточно перейти на ручное управление.
Суть заключается в переводе дат в числовой формат на стороне базы и обратное преобразование во время (там, где надо) на стороне клиента. Такое решение не сильно обременительно, зато дает массу преимуществ: Трюк по экономии памяти и времени исполнения без потери информации Хелпер для детального анализа занимаемой data.frame памятью Повторно полезные ссылки по форматам и калькуляторам, необходимым при анализе путей следования дат в ИС и БД При отображении графиков, подготовке текстов, группировке временных интервалов, преобразовании текста даты и подобное часто требуетя выдать или распознать дату в хитром виде. Ниже ряд подходов и функций.    Пишем календарные дни в различных локалях. Не зависит от платформы исполнения. Иногда возникает необходимость собственного форматирования меток осей. Ниже пример по созданию такой функции  Создадим тестовый набор записей Типичный вопрос аналитика: У меня данные хранятся в формате год/месяц/число. Мне не все нужны, а только суббота, как мне отфильтровать? Пример кода. Не забываем, что ряд функций работает с учетом локали машины на которой выполняется код. И если у вас месяц печатается на русском, то это не гарантирует (если не использовать специальные методы) аналогичное поведение на другой машине или другой ОС.  P.S. Большинство тестов приведены исключительно для примера. Можете запускать на своих машинах, число будут совершенно иными, но характер зависимости и соотношения должен примерно сохраняться. Предыдущая публикация — «R vs Python в продуктивном контуре». Data Science