Mathematica 8.0 эффективный способ анализа DateList из строки в формате yyyyMMddHHmmssSSS - PullRequest
9 голосов
/ 01 декабря 2011

У меня есть следующая строка: «20110103224832494» в следующем формате: yyyyMMddHHmmssSSS.Где yyyy - год, MM - месяц, dd - день, HH - час, mm - минуты, ss - секунды, SSS - миллисекунды.

Я думал, что сработало бы следующее:

DateList[{"20110103224832494",  
         {"Year", "Month", "Day", "Hour", "Minute", "Second", "Millisecond"}}
]

но возвращает:

DateString::str: String 20110103224832494 cannot be interpreted as a date in 
format {Year,Month,Day,Hour,Minute,Second,Millisecond}. >>

А если бы это сработало, было бы это эффективно?

Ответы [ 2 ]

10 голосов
/ 01 декабря 2011

Использование:

DateList[{"20110103224832494",  
   Riffle[{"Year",
           "Month", 
           "Day",   
           "Hour", 
           "Minute", 
           "Second", 
           "Millisecond"}, ""]}]
9 голосов
/ 01 декабря 2011

Исправлено, чтобы объединить миллисекунды с секундами.

Вы указали «эффективный», и я считаю, что это на два порядка быстрее, чем DateList:

stringDynP[s_String, p_] :=
  StringTake[s, Thread@{{0}~Join~Most@# + 1, #} &@Accumulate@p]

toDateList[string_String] := 
  MapAt[#/1000` &, #, -1] &[
    FromDigits /@ stringDynP[string, {4, 2, 2, 2, 2, 5}]
  ]

toDateList["20110103224832494"]
{2011, 1, 3, 22, 48, 32.494}

stringDynP - это строковая адаптация моей функции "Динамическое разбиение" .


Предупреждение для пользователей Mathematica 7 : метод DateList дает ложный результат:

{2011, 1, 12, 9, 23, 24.094}

Предположительно в версии 8 может использоваться следующий метод:

DateList[
 {"20110103224832494",
   {"Year", "Month", "Day", "Hour","Minute", "Second", "Millisecond"}},
 DateDelimiters -> None
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...