Как извлечь DateTime из смешанной строки в Matlab - PullRequest
1 голос
/ 24 июня 2019

У меня есть вектор строк со строкой 100K в Matlab.Каждая строка содержит смесь алфавитов, цифр и [./@;,]

Мне нужно определить, существуют ли эти шаблоны в каждой строке:

MM/dd/YYYY HH:mm
MM.dd.YYYY HH:mm
MM/dd/YY HH:mm
MM.dd.YY HH:mm

пример:

"Read back and verified on 1/15/13 1935 CM;"
"Was negative on 02.10.2015 @ 2015;"
"Result came back positive 4.2.2016 0821;"

Выходные данные должны быть (в формате даты и времени):

01/15/2013 19:35
02/10/2015 20:15
04/02/2016 08:21

1 Ответ

3 голосов
/ 24 июня 2019

Вы можете использовать следующий набор регулярных выражений.Я рассматриваю двузначные годы следующим образом:

Если год больше сегодняшнего года минус 2000, предположим, что это 19xx, в противном случае предположим 20xx.Ожидайте проблем с этим после 2099; -)

Редактировать: Я использовал strings в качестве переменной, но это тоже команда.Я изменил имя переменной на string_list.

patterns = [ ...
    '(?<month>\d{1,2})/(?<day>\d{1,2})/(?<year>\d{4}) @? ?(?<hours>\d{2})(?<minutes>\d{2})|'   ... % {m}m/{d}d/YYYY {@ }hhmm
    '(?<month>\d{1,2})\.(?<day>\d{1,2})\.(?<year>\d{4}) @? ?(?<hours>\d{2})(?<minutes>\d{2})|' ... % {m}m.{d}d.YYYY {@ }hhmm
    '(?<month>\d{1,2})/(?<day>\d{1,2})/(?<year>\d{2}) @? ?(?<hours>\d{2})(?<minutes>\d{2})|'   ... % {m}m/{d}d/YY {@ }hhmm
    '(?<month>\d{1,2})\.(?<day>\d{1,2})\.(?<year>\d{2}) @? ?(?<hours>\d{2})(?<minutes>\d{2})'  ... % {m}m.{d}d.YY{@ }hhmm
];

string_list = [ ...
    "Read back and verified on 1/15/13 1935 CM;"
    "Was negative on 02.10.2015 @ 2015;"
    "Result came back positive 4.2.2016 0821;"   
    "Some test for a year earlier than 2000 4.2.89 0821;"   
];

matches = regexp(string_list, patterns,'names');

today = datetime('today');
currentyear = today.Year - 2000;

dates = cell(size(matches));
for i = 1:numel(matches)
    year = str2double(matches{i}.year);
    if year < 100 
        if year > currentyear
            year = year + 1900;
        else
            year = year + 2000;
        end
    end
    dates{i} = datetime(year, str2double(matches{i}.month), str2double(matches{i}.day), str2double(matches{i}.hours), str2double(matches{i}.minutes), 0); 
end

Результат:

dates =

  4×1 cell array

    {[15-Jan-2013 19:35:00]}
    {[10-Feb-2015 20:15:00]}
    {[02-Apr-2016 08:21:00]}
    {[02-Apr-1989 08:21:00]}

Возможно, петлю for в конце можно упростить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...