Анализ данных часто подразумевает наличие не только чисел или строк, но и даты или времени в разнообразных форматах. pandas предоставляет возможности для работы с датами; в данном разделе рассматриваются эти возможности.

Unix timestamps

Формат Unix timestamps широко используется в Unix-системах. В pandas работа с Unix timestamp может показаться сложной. Мы будем работать с файлом "popularity-contest".

In [1]:
%matplotlib inline

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

plt.style.use('ggplot')  # Красивые графики
plt.rcParams['figure.figsize'] = (15, 5)  # Размер картинок
In [2]:
# Чтение файла и удаление последней строки
popcon = pd.read_csv('data/popularity-contest', sep=' ')[:-1]
popcon.columns = ['atime', 'ctime', 'package-name', 'mru-program', 'tag']
In [3]:
popcon[:5]
Out[3]:
atime ctime package-name mru-program tag
0 1387295797 1367633260 perl-base /usr/bin/perl NaN
1 1387295796 1354370480 login /bin/su NaN
2 1387295743 1354341275 libtalloc2 /usr/lib/x86_64-linux-gnu/libtalloc.so.2.0.7 NaN
3 1387295743 1387224204 libwbclient0 /usr/lib/x86_64-linux-gnu/libwbclient.so.0
4 1387295742 1354341253 libselinux1 /lib/x86_64-linux-gnu/libselinux.so.1 NaN

Основная хитрость работы с timestamp в pandas заключается в том, что numpy datetime хранятся в виде Unix timestamp. Следовательно, нужно лишь указать pandas, что эти числа означают дату - они не нуждаются в трансформациях.

Начнем с преобразования в целые числа:

In [4]:
popcon['atime'] = popcon['atime'].astype(int)
popcon['ctime'] = popcon['ctime'].astype(int)

В массиве numpy и pandas серии каждый элемент определён своим типом (dtype) - как правило, int64, float64, или object. Доступны специфические типы для представления времени, такие как datetime64[s], datetime64[ms], и datetime64[us], а также тип timedelta.

Функция pd.to_datetime позволяет преобразовать числа в даты и время. Это не занимает много времени, так как мы всего лишь сообщаем pandas о значении данных, не изменяя их содержимого.

In [5]:
popcon['atime'] = pd.to_datetime(popcon['atime'], unit='s')
popcon['ctime'] = pd.to_datetime(popcon['ctime'], unit='s')

Проверим тип данных atime и ctime. М8 - это скрытое обозначение для datetime64.

In [6]:
popcon['atime'].dtype
Out[6]:
dtype

Давайте взглянем на atime и ctime теперь как на даты!

In [7]:
popcon[:5]
Out[7]:
atime ctime package-name mru-program tag
0 2013-12-17 15:56:37 2013-05-04 02:07:40 perl-base /usr/bin/perl NaN
1 2013-12-17 15:56:36 2012-12-01 14:01:20 login /bin/su NaN
2 2013-12-17 15:55:43 2012-12-01 05:54:35 libtalloc2 /usr/lib/x86_64-linux-gnu/libtalloc.so.2.0.7 NaN
3 2013-12-17 15:55:43 2013-12-16 20:03:24 libwbclient0 /usr/lib/x86_64-linux-gnu/libwbclient.so.0
4 2013-12-17 15:55:42 2012-12-01 05:54:13 libselinux1 /lib/x86_64-linux-gnu/libselinux.so.1 NaN

Теперь рассмотрим все пакеты, которые не являются библиотеками.

Для начала, посмотрим, что находится в данных с timestamp равным 0. Возможно использование строки для сравнения, даже если данные состоят из timestamp. Это одна из причин, почему pandas так удобен в применении.

In [8]:
popcon = popcon[popcon['atime'] > '1970-01-01']

Теперь возможны магические манипуляции со строками с помощью pandas, проверив, где имя пакета не включает 'lib'.

In [9]:
nonlibraries = popcon[~popcon['package-name'].str.contains('lib')]
In [10]:
nonlibraries.sort_values('ctime', ascending=False)[:10]
Out[10]:
atime ctime package-name mru-program tag
57 2013-12-17 04:55:39 2013-12-17 04:55:42 ddd /usr/bin/ddd
450 2013-12-16 20:03:20 2013-12-16 20:05:13 nodejs /usr/bin/npm
454 2013-12-16 20:03:20 2013-12-16 20:05:04 switchboard-plug-keyboard /usr/lib/plugs/pantheon/keyboard/options.txt
445 2013-12-16 20:03:20 2013-12-16 20:05:04 thunderbird-locale-en /usr/lib/thunderbird-addons/extensions/langpac...
396 2013-12-16 20:08:27 2013-12-16 20:05:03 software-center /usr/sbin/update-software-center
449 2013-12-16 20:03:20 2013-12-16 20:05:00 samba-common-bin /usr/bin/net.samba3
397 2013-12-16 20:08:25 2013-12-16 20:04:59 postgresql-client-9.1 /usr/lib/postgresql/9.1/bin/psql
398 2013-12-16 20:08:23 2013-12-16 20:04:58 postgresql-9.1 /usr/lib/postgresql/9.1/bin/postmaster
452 2013-12-16 20:03:20 2013-12-16 20:04:55 php5-dev /usr/include/php5/main/snprintf.h
440 2013-12-16 20:03:20 2013-12-16 20:04:54 php-pear /usr/share/php/XML/Util.php

Отлично, это демонстрирует установку пакетов ddd и postgresql. Очень полезно.

Вопросы для самопроверки:

  1. Что такое Unix timestamps и как они используются в pandas?
  2. В чем заключается особенность работы с timestamp в pandas?
  3. Какие специфические типы данных доступны в pandas для представления времени?
  4. Какая функция используется для преобразования чисел в даты и время?