Генерация числа данных Matlab

#matlab #date

#matlab #Дата

Вопрос:

Я использую dtstr2dtnummx, потому что это быстрее, но я столкнулся с проблемой, эта функция генерирует другое число данных, или, возможно, мой формат даты неверен

дата = {‘2011-03-13 23:59:59.100’}

out1 =число данных (дата)

out2=dtstr2dtnummx (дата, ‘гггг-мм-дд ЧЧ: ММ:SS.SSS’)

и выходные данные являются:

дата =

 '2011-03-13 23:59:59.100'
  

out1 =

       734575.999989583
  

out2 =

       736281.960423495
  

Я не знаю, где ошибка

Обновить

Я нашел ответ, со следующим dateformat я получаю тот же результат

dtstr2dtnummx (дата, ‘ГГГГ-ММ-дд ЧЧ: мм:ss.SSS’)

Но я не знаю, почему так, потому что я следовал этому руководству, но я получаю неверный вывод, если кто-нибудь знает ответ, пожалуйста, поделитесь им.

Ответ №1:

datenum и dtstr2dtnummx используйте разные строки формата: datenum вызовы cnv2icudf для преобразования «токенов формата даты в токены формата даты ICU» (см. help cnv2icudf ), которые можно использовать с dtstr2dtnummx . Обратите внимание, что это включает в себя замену верхнего и нижнего регистра на ММ (замена месяца и минут). Другими словами, вы использовали документацию для datenum для создания строки формата для dtstr2dtnummx , которая является недокументированной и частной.

Чтобы получить правильную строку формата для использования, вы можете вызвать

 cnv2icudf('yyyy-mm-dd HH:MM:SS.FFF')
  

в результате

ans =

гггг-ММ-дд ЧЧ:мм:ss.SSS

что довольно близко к решению, которое вы нашли сами.

Усвоенный урок: есть причина, по которой dtstr2dtnummx это частная функция — не вызывайте ее, пока не поймете оболочку datenum ;-).

Кстати, из любопытства: вы действительно профилировали свой код и обнаружили datenum , что он является основным виновником?

Комментарии:

1. Обратите внимание, что ваша исходная строка формата ‘гггг-мм-дд ЧЧ: ММ:SS.SSS’ представляет собой смесь обоих форматов — миллисекунды для datenum являются ‘FFF’, в то время как для частной функции они являются ‘SSS’

2. Возможно, мне следует упомянуть, что для того, чтобы вообще иметь возможность вызывать эти частные функции, я скопировал их из C:Program FilesMATLABR2010btoolboxmatlabtimefunprivatecnv2icudf.m в свой рабочий каталог…

3. Да, я скопировал туда dtstr2dtnummx в 🙂

4. Я протестировал время выполнения и 1000 разговоров, которые занимают от 3,5 с до 4 с, а с dtstr2dtnummx это занимает всего 0,8 с, так что это действительно большая оптимизация 🙂 потому что у меня действительно большая база данных (измерения), 100 миллионов строк, поэтому в этом случае она учитывает время