7
$\begingroup$

I have a date/time string from a data file in the form "2014/01/09 07:24:36:001".

I would like to convert it to a DateObject. I cannot do it by hand because I have about a thousand of them.

This does not work:

DateObject["2014/01/09 07:24:36:001", 
 DateFormat -> {"Year", "/", "Month", "/", "Day", " ", "Hour24", ":", 
   "Minute", ":", "Second", ":", "Millisecond"}]

It returns the error:

DateObject::str: String 2014/01/09 07:24:36:001 cannot be interpreted as a date.

This does work however so I think DateObject does not like the "Millisecond" part.

DateObject["2014/01/09 07:24:36", 
 DateFormat -> {"Year", "/", "Month", "/", "Day", " ", "Hour24", ":", 
   "Minute", ":", "Second"}]

How do I convert the date/time string "2014/01/09 07:24:36:001" to a DateObject without losing the fractional second information?

$\endgroup$
  • $\begingroup$ This looks like a bug or at least an developer oversight and insufficient QA checking $\endgroup$ – Mike Honeychurch Nov 20 '15 at 23:45
3
$\begingroup$

Here is a helper function to interpret your dates:

Clear[interpretDate]

interpretDate[string_String] :=
 Module[
   {year, month, day, hours, minutes, seconds, milliseconds},
   {year, month, day, hours, minutes, seconds, milliseconds} =
    ToExpression@StringSplit[string, {":", "/", " "}];
  DateObject[
   {year, month, day},
   TimeObject[{hours, minutes, seconds}] + Quantity[milliseconds, "ms"]
  ]
 ]

See for instance:

firstdate = interpretDate["2014/01/09 07:24:36:001"];
seconddate = interpretDate["2014/01/09 07:24:36:450"];
seconddate - firstdate

(* Out: Quantity[0.4489998817443847, "Seconds"] *)
$\endgroup$
3
$\begingroup$

Using DateList first and then using DateObject seems to work:

DateObject[
 DateList[{"2014/01/09 07:24:36:985", {"Year", "/", "Month", "/", 
    "Day", " ", "Hour24", ":", "Minute", ":", "Second", ":", 
    "Millisecond"}}]]

The fractional seconds are in the DateObject, but are not displayed.

Consider:

date1 = DateObject[DateList[{"2014/01/09 07:24:36:555", {"Year", "/", "Month", "/","Day", " ", "Hour24", ":", "Minute", ":", "Second", ":","Millisecond"}}]]
date2 = DateObject[DateList[{"2014/01/09 07:24:36:100", {"Year", "/", "Month", "/","Day", " ", "Hour24", ":", "Minute", ":", "Second", ":", 
 "Millisecond"}}]]
FullForm[date1]
FullForm[date1 - date2]

This is directly visible by looking at the InputForm, e.g.

InputForm@date1
(* 
 DateObject[{2014, 1, 9}, TimeObject[{7, 24, 36.555}, TimeZone -> -6.], TimeZone -> -6.]
*)
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.