Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Статистика в SPSS: за пределами кнопочного интерфейса. Выпуск 13


Статистика в SPSS: за пределами кнопочного интерфейса. Выпуск 13

В рассылке используются материалы веб-сайта www.spsstools.ru

Содержание выпуска

Преобразование дат при импорте из Excel

Новое на сайте www.spsstools.ru


Здравствуйте, уважаемые подписчики!

Преобразование дат при импорте из Excel

В следующем выпуске рассылки, который, против обыкновения, выйдет в начале следующей недели, во вторник, вас ожидает информация о новом проекте. Подробности раскрывать не будем, но искренне надеюсь, что он будет вам интересен. Много времени и сил уходит на его запуск, поэтому этот выпуск получится у нас совсем небольшим. Но не без изюминки.

Рассмотрим синтаксис Импорт из MS Excel (конвертировать число дней в дату).SPS из коллекции Raynald’s SPSS Tools. Проблема такова: при попытке импорта данных из MS Excel в SPSS в том случае, если импортируются переменные формата даты, SPSS принимает, как будто, не исходные переменные, а непонятные числа, не имеющие, на первый взгляд, никакого к датам отношения. Так, если в Excel переменная формата даты содержала значение "31.03.2006", будучи помещенной в SPSS, она будет содержать значение "38807". Строго говоря, так будет не всегда. Вариантов понимания SPSS дат MS Excel может быть несколько. Это зависит и от способа импортирования (через "карман" (буфер обмена), через третий файл текстового формата, через драйверы ODBC), и, возможно, от системных настроек компьютера. При импорте посредством драйверов велика вероятность, что формат данных в виде дат будет распознан верно и SPSS "автоматически" создаст переменную формата даты, куда поместит импортируемые значения. В ряде случаев, особенно при импорте посредством буфера обмена, значения дат из Excel будут вовсе вставлены в SPSS как пропуски. Независимо от того, как обстоит дело в вашем случае, подобная постановка вопроса затрагивает более серьёзную проблему - способ хранения и обработки дат в разных программах.

Первый момент, который надо принять к сведению - во многих современных программах дата хранится как числовая переменная и лишь при её использовании/отображении она принимает "обличье" даты по заданному образцу (формату): хотите - с точками, хотите - с наклонными чертами, хотите - в виде 31-MAR-2006, хотите - с двумя цифрами для обозначения года, хотите - с четырьмя... Фактически же - это просто некоторое число, и понимание этого даёт нам возможность обращаться с датами как с числами.

В частности, в MS Excel дата обычно хранится в виде количества дней, прошедших с 31 декабря 1899 года (в версиях для Mac база другая). Считается, что пользователю не потребуется запись более ранних дат.

В SPSS подошли к делу "серьёзнее". Пакет хранит дату как количество секунд, прошедших с 14 октября 1582 года (помните, было времечко? :-)). Причём первые 86400 секунд (сутки) он не считает. Первая дата, возможная в пакете, начинается с 86401-й секунды, т.е. с 15 октября того же года.

Теперь нам ясно, что 38807 - это лишь количество дней, прошедших с 31 декабря 1899 года по 31 марта 2006 года. То же число вы получите, если измените формат даты соответствующей ячейки в Excel на числовой.

Таким образом, чтобы "восстановить" дату из числа 38807, надо взять дату 31 декабря 1899 года и прибавить к ней 38807 дней. При этом можно считать, что алгоритм преобразования числа в формат даты, т.е. календарь со всеми високосными годами, "зашит" в программу.

Следующий синтаксис предлагает рассмотреть пару переменных (var1 и var2), отличающихся друг от друга лишь типом - первая из них числовая (см. формат F8.0 - восемь знаков, ноль знаков после запятой), другая - текстовая (A - признак текстового формата, 6 - длина строки). Содержат они одни и те же числа, которые, вообще говоря, являются датами "по версии" MS Excel.

Вводим мы данные через знакомую подписчикам команду DATA LIST. Заключительная команда LIST играет для нас роль команды EXECUTE. При этом она не только выполняет отложенные вычисления, но и выводит значения всех переменных в окно результата.

DATA LIST LIST /var1(F8.0) var2(A6).

BEGIN DATA
1 "1"
60 "60"
36604 "36604"
25000 "25000"
38807 "38807"

END DATA.

LIST.

Допустим, что именно в таком виде вы получили даты при импорте их из MS Excel. Тогда задача - преобразовать эти числа в даты SPSS.

В коллекции Рейналя предлагается выполнить для этого следующие несложные команды:

COMPUTE date1=date.dmy(1,1,1900)+ (var1-2)*60*60*24.

COMPUTE date2=date.dmy(1,1,1900)+ (NUMBER(var2,F8.0)-2)*60*60*24.

FORMATS date1 date2 (ADATE12).

LIST.

Первый COMPUTE ориентирован на преобразование переменной числового типа. Второй COMPUTE делает такие же, по сути преобразования, но с текстовой (функция NUMBER на лету преобразовывает число из текстового формата в формат, подходящий для арифметических операций). Команда FORMATS преобразовывает созданные вновь числовые переменных date1 и date2 в вид даты, а команда LIST вновь заставляет выполнить все отложенные вычисления, то есть, позволяет увидеть нам результат.

Но давайте более подробно разберём первый COMPUTE. Функция date.dmy с параметрами (1,1,1900) возвращает число секунд, прошедшее с 14 октября 1582 года по 1 января 1900. Затем к этому числу нам следует прибавть число дней, прошедшее с 31 декабря 1899 года по дату, представленную числом, содержащимся в переменной, но выраженное в секундах. Этим объясняется "хвост" из множителей 60*60*24, что даёт нам заветные 86400 - количество секунд в сутках.

Но зачем мы корректируем исходное число дней из переменной var1 на 2 дня в меньшую сторону? Первая "минус единица" весьма понятна. Если мы прибавляем число секунд к 1.1.1900, а не к 31.12.1899, нужно вычесть один день. Откуда взялась вторая единица?.. И зачем она?

В самом деле, если известно, что дата в Excel - количество дней, прошедших с 31.12.1899, то число 1 должно представлять собой 1 января 1900 года. Но в нашем алгоритме это будет всё то же 31 декабря 1899 года. То есть, наш алгоритм будет "врать". С другой стороны, для числа 38807 он вернёт дату 31 марта 2006 года, что будет совершенно корректно.

Получается, что наш алгоритм "работает" для преобразований одних дат из формата Excel в формат SPSS, и "не работает" для других. Для меня это некоторое время было загадкой, которую я разрешил лишь путём "локализации" ошибки, пытаясь вводить разные даты для преобразования. Оказывается, "водораздел" проходит между февралём и мартом 1900 года. Для значений дат, импортированных из Excel, относящихся к январю-февралю 1900 года наш алгоритм врёт, а для более поздних дат работает нормально. Выяснилось, что врёт тут не наш алгоритм, а алгоритм форматирования дат в MS Excel. 1900 год не является високосным, однако Excel его считает таким. То есть, например, значение 60 в MS Excel интерпретируется как 29 февраля 1900 года, а в нашем алгоритме вполне законно является 1 марта 1900 года, поскольку дня 29 февраля 1900 года в человеческой истории не существовало. Отсюда и необходимость вычитания второй единицы. Что и было сделано Рейналем - автором синтаксиса.

Ваш покорный слуга, проверяя свои догадки, нашёл в интернете пару ссылок, которые проливают свет и на вопрос "невисокосности" 1900 года, и на обнаруженную неточность в Excel. Дотошный читатель ознакомится с этими материалами:

href="http://y2k.stack.ru/info/info.htm

http://www.troitsk.org/index.php?t=4675

Заключительные команды в разбираемом синтаксисе преследуют цель создания строковой переменной, содержащей дату, на основании полученных ранее преобразований. КОМАНДА STRING создаёт строковую переменную z длиной 11 символов, а следующий за ней COMPUTE записывает туда дату, конвертированную в строку посредством ФУНКЦИИ STRING. Отложенные вычисления запускаются EXECUTE.

STRING z(A11).

COMPUTE z=STRING(date2,ADATE11).

EXECUTE.

 

Это весь материал на сегодня. Удачных выходных!

 

Ведущий рассылки,

Балабанов Антон

Новое на сайте www.spsstools.ru

Переведены и добавлены примеры синтаксиса:

Извлечь время из строки, содержащей дату и время.SPS

Конвертировать время из формата AM PM к «военному» формату.SPS

Импорт из MS Excel (конвертировать число дней в дату).SPS

 

© См. www.spsstools.ru, 2005-2006


В избранное