MathGroup Archive 2001

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Import numbers and dates

  • To: mathgroup at smc.vnet.net
  • Subject: [mg30581] Re: [mg30558] Import numbers and dates
  • From: "P.J. Hinton" <paulh at wolfram.com>
  • Date: Thu, 30 Aug 2001 03:51:27 -0400 (EDT)
  • Organization: "Wolfram Research, Inc."
  • Sender: owner-wri-mathgroup at wolfram.com

On Wed, 29 Aug 2001, Martin Richter wrote:

> I want to import some data which consists 3862 lines, each lines looks like
> this:
> 07-01-85    101.101897  07-01-85    101.101897
>
> So 1. and 3. rows are dates and should be read that way and 2. and 4. rows
> are real numbers. I have tried something like this:
> data = Import["file.txt", "Table", DateStyle -> European];

There are several problems here:

1) The heuristic that Import[] applies to determine if a field is a date
assumes that a forward slash is used as a delimiter, not a minus sign.
Your example gets parsed as a subtraction operation.

2) Format specific settings for Import are passed as aggregate options.
The correct syntax for specifying the date format would be

	ConversionOptions -> {"DateStyle" -> "European"}

3) The date uses a two-digit format.  The default behavior is to leave
dates with two-digit years as strings rather than trying to expand them
out to a date with a four-digit year.  There is a conversion option called
"TwoDigitYearFunction" which enables the user to specify what kind of
heuristic should be applied.

> Indeed this is easy in Excel but I would like to use Mathematica 4.1.
> (I properly getting environmental damage :-)

If you are dealing with a data set that cannot be reformatted easily, then
it's probably better to write a few lines of Mathematica code that is
tailored to your specific problem.

Start by writing a function that breaks a date field into its proper
elements:

parseMyDate[str_String]:=
  Module[
    {stmp, lst},
    stmp = StringToStream[str];
    lst = ReadList[stmp, {Word, Word, Word},
      WordSeparators -> "-"];
    Close[stmp];
    Return[Flatten[ToExpression /@ lst]]
  ]

parseMyDate[expr_]:= expr

Note that this function should probably have some additional validation
elements if other, non-date, non-numeric fields are present.

We also provide a higher level function that reads in the complete file.

importMyTable[fileName_String]:=
Map[
  parseMyDate,
  ReadList[
    fileName,
    {Word, Number, Word, Number}
  ],
  {2}
]

Here is the output for a two-record data set that uses your formatting
convention.

In[]:=
importMyTable["mydata.dat"]

Out[]=
{{{7, 1, 85}, 101.102, {7, 1, 85}, 101.102},
  {{7, 1, 85}, 101.102, {7, 1, 85}, 101.102}}

-- 
P.J. Hinton
User Interface Programmer                         paulh at wolfram.com
Wolfram Research, Inc.




  • Prev by Date: Re: Eulerian numbers
  • Next by Date: Re: Eulerian numbers
  • Previous by thread: Re: Import numbers and dates
  • Next by thread: System for which Solve and NSolve both fail