Перейти к содержимому

Дата и время

Столбцы с датой и временем нужны для журналов, расписаний, продаж, измерений и любых данных, где важен порядок событий.

DataFrame умеет автоматически распознавать даты при загрузке CSV. После этого дату можно печатать в нужном формате, фильтровать, сортировать и разбивать на год, месяц или день.

Если значения записаны как даты, DataFrame распознаёт столбец как DateTime. Поддерживается ISO-формат 2024-09-01 и привычный русский формат 01.09.2024.

uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Дата,Температура
01.09.2024,18
02.09.2024,20
03.09.2024,17
''');
df.PrintInfo;
end.

Вывод:

Строк : 3
Столбцов : 2
==========================================
Дата : DateTime (3 без пропусков)
Температура : Int (3 без пропусков)

PrintInfo показывает, что столбец Дата имеет тип DateTime.

ISO-формат — это запись даты в порядке год-месяц-день, например 2024-09-01. Русский формат обычно записывается как день.месяц.год: 01.09.2024.

Для печати даты в привычном виде используется параметр dateTimeFormat.

uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Дата,Температура
01.09.2024,18
02.09.2024,20
03.09.2024,17
''');
df.Print(dateTimeFormat := 'dd.MM.yyyy');
end.

Формат влияет только на вывод. Значения в таблице остаются значениями DateTime.

Для фильтрации удобно создать границы периода через функцию DT.

DT — это короткая создающая функция для значений DateTime. Например, DT(2024, 9, 2) создаёт дату 2 сентября 2024 года.

uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Дата,Температура
2024-09-01,18
2024-09-02,20
2024-09-03,17
2024-09-04,21
''');
var d1 := DT(2024, 9, 2);
var d2 := DT(2024, 9, 3);
var period := df.Filter(row ->
(row.DateTime('Дата') >= d1) and
(row.DateTime('Дата') <= d2)
);
period.Print(dateTimeFormat := 'dd.MM.yyyy');
end.

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

Вывод:

Дата Температура
02.09.2024 20
03.09.2024 17

SortBy сортирует DateTime-столбец как дату, а не как текст.

uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Дата,Событие
2024-09-03,Контрольная
2024-09-01,Начало темы
2024-09-02,Практика
''');
df.SortBy('Дата').Print(dateTimeFormat := 'dd.MM.yyyy');
end.

Вывод:

Дата Событие
01.09.2024 Начало темы
02.09.2024 Практика
03.09.2024 Контрольная

WithDatePart создаёт новый столбец из части даты: года, месяца, дня и так далее.

uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Дата,Температура
2024-09-01,18
2024-09-02,20
2024-10-01,12
2024-10-02,14
''');
var byMonth := df.WithDatePart('Дата', 'Месяц', dpMonth);
byMonth.Print(dateTimeFormat := 'dd.MM.yyyy');
end.

Вывод:

Дата Температура Месяц
01.09.2024 18 9
02.09.2024 20 9
01.10.2024 12 10
02.10.2024 14 10

Основные варианты:

  • dpYear — год;
  • dpMonth — месяц;
  • dpDay — день месяца;
  • dpDayOfWeek — день недели;
  • dpDate — дата без времени.

После выделения части даты можно использовать обычную группировку.

uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Дата,Температура
2024-09-01,18
2024-09-02,20
2024-10-01,12
2024-10-02,14
''');
df.WithDatePart('Дата', 'Месяц', dpMonth)
.GroupBy('Месяц')
.Mean('Температура')
.Print;
end.

Такая цепочка сначала добавляет столбец Месяц, затем группирует строки по месяцу и считает среднюю температуру.

Вывод:

Месяц Температура_среднее
9 19.00
10 13.00
  • Даты обычно распознаются автоматически при загрузке CSV.
  • Для вывода используйте dateTimeFormat.
  • Для фильтрации по периоду удобно создавать даты через функцию DT.
  • SortBy сортирует DateTime-столбцы в хронологическом порядке.
  • WithDatePart помогает получить год, месяц, день и другие части даты.