Преобразование вектора даты возвращает непредвиденный выход

Примечание

Лучшая практика - использовать datetime значения для представления точек во времени, а не векторов дат. В отличие от векторов дат, datetime значения отображаются в читаемом человеком формате, часто избегая необходимости преобразования в текст. Если вам нужно преобразовать вектор даты в текст, лучшая практика - сначала преобразовать его в datetime значение и затем, чтобы преобразовать datetime значение текста при помощи string или char функций. В то время как вы можете преобразовать векторы дат в текст непосредственно с помощью datestr функция, вы можете получить неожиданные результаты, как описано в этом разделе.

Поскольку вектор даты является вектором-строкой чисел 1 на 6, datestr функция может интерпретировать вход векторы дат как векторы серийных номеров дат и вернуть неожиданные выходы. Или он может интерпретировать векторы серийных номеров дат как векторы дат. Эта неоднозначность существует, потому что datestr имеет эвристическое правило для интерпретации вектора-строки 1 на 6 как вектора дат или вектора с шестью серийными номерами дат. Та же неоднозначность применяется к входам, которые m-by-6 числовых матриц, где каждая строка может быть интерпретирована как вектор даты или как шесть серийных номеров даты.

Например, рассмотрим вектор даты, который включает в себя год 3000. Этот год находится вне области значений лет, которые datestr интерпретирует как элементы векторов дат. Поэтому вход интерпретируется как вектор 1 на 6 серийных номеров дат.

d = datestr([3000 11 05 10 32 56])
d =

  6×11 char array

    '18-Mar-0008'
    '11-Jan-0000'
    '05-Jan-0000'
    '10-Jan-0000'
    '01-Feb-0000'
    '25-Feb-0000'

Здесь datestr интерпретирует 3000 как серийный номер даты и преобразует его в текст '18-Mar-0008' (дата - 3000 дней после 0-Jan-0000). Также, datestr преобразует следующие пять элементов так же, как и серийные номера дат.

Существует два метода преобразования такого вектора даты в текст.

  • Рекомендуемый метод состоит в том, чтобы преобразовать вектор даты в datetime значение. Затем преобразуйте его, используя char, cellstr, или string функция. datetime функция всегда обрабатывает 1 на 6 числовых векторов как векторы дат.

    dt = datetime([3000 11 05 10 32 56]);
    ds = string(dt)
    
    dt =
    
        "05-Nov-3000 10:32:56"
    
  • В качестве альтернативы преобразуйте его в серийный номер даты с помощью datenum функция. Затем преобразуйте номер даты в вектор символов с помощью datestr.

    dn = datenum([3000 11 05 10 32 56]);
    ds = datestr(dn)
    
    ds =
    
        '05-Nov-3000 10:32:56'
    

При преобразовании дат в текст, datestr интерпретирует вход как векторы дат или серийные номера дат с помощью эвристического правила. Рассмотрим m-by-6 матрица. datestr функция интерпретирует матрицу как m векторы дат, когда:

  • Первые пять столбцов содержат целые числа.

  • Абсолютное значение суммы каждой строки находится в области значений 1500-2500.

Если любое условие ложно, для любой строки, то datestr интерпретирует m-by-6 матрица как m-by-6 матрица серийных номеров дат.

Обычно даты с годами в области значений 1700-2300 интерпретируются как векторы дат. Однако, datestr может интерпретировать строки с месяцами, днями, часами, минутами или вторыми значениями вне их нормальных областей значений как серийные номера дат. Для примера, datestr правильно интерпретирует следующий вектор дат на 2020 год:

d = datestr([2020 06 21 10 51 00])
d =

    '21-Jun-2020 10:51:00'

Но учитывая значение дня вне типичной области значений (1-31), datestr возвращает дату для каждого элемента вектора.

d = datestr([2020 06 2110 10 51 00])
d =

  6×11 char array

    '12-Jul-0005'
    '06-Jan-0000'
    '10-Oct-0005'
    '10-Jan-0000'
    '20-Feb-0000'
    '00-Jan-0000'

Снова, datetime функция всегда обрабатывает числовые входы как векторы дат. В этом случае он вычисляет соответствующую дату, интерпретируя 2110 как 2110-й день с начала июня 2020 года.

d = datetime([2020 06 2110 10 51 00])
d = 

  datetime

   11-Mar-2026 10:51:00
  • Когда у вас есть матрица векторов дат, которые datestr может неправильно интерпретировать как серийные номера дат, преобразовать матрицу при помощи datetime или datenum функций. Затем преобразуйте эти значения в текст.

  • Когда у вас есть матрица серийных номеров дат, которые datestr можно интерпретировать как векторы дат, сначала преобразовать матрицу в вектор-столбец. Затем используйте datestr для преобразования вектора-столбца.

См. также

| | | | |

Похожие темы