Анализ данных с помощью pandas. Часть 7: работа с датами и временем

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

Unix timestamps

Самый распространённый формат в Unix. Неочевидно, что делать с Unix timestamp в pandas. Файл, который мы будем использовать - "popularity-contest", найденный в папке /var/log/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]:
# Read it, and remove the last row
popcon = pd.read_csv('data/popularity-contest', sep=' ')[:-1]
popcon.columns = ['atime', 'ctime', 'package-name', 'mru-program', 'tag']
In [3]:
popcon[:5]
Out[3]:
atimectimepackage-namemru-programtag
013872957971367633260perl-base/usr/bin/perlNaN
113872957961354370480login/bin/suNaN
213872957431354341275libtalloc2/usr/lib/x86_64-linux-gnu/libtalloc.so.2.0.7NaN
313872957431387224204libwbclient0/usr/lib/x86_64-linux-gnu/libwbclient.so.0
413872957421354341253libselinux1/lib/x86_64-linux-gnu/libselinux.so.1NaN

Магия в обработке timestamp в pandas в том, что numpy datetime сохраняются, как Unix timestamp. Поэтому всё, что нам нужно - это сказать pandas, что эти целые числа - это datetimes - они не требуют каких-либо преобразований.

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

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

Каждый массив numpy и pandas series имеют тип (dtype) - обычно это int64, float64, или object. Некоторые типы времени доступны как datetime64[s], datetime64[ms], и datetime64[us]. Также есть тип timedelta.

Мы можем использовать функцию pd.to_datetime для преобразования чисел в datetime. Это не требует времени - мы не изменяем данные, а говорим pandas о том, что они означают.

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

Посмотрим на dtype, он . M8 это секретный код для datetime64.

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

Посмотрим на atime и ctime как на даты!

In [7]:
popcon[:5]
Out[7]:
atimectimepackage-namemru-programtag
02013-12-17 15:56:372013-05-04 02:07:40perl-base/usr/bin/perlNaN
12013-12-17 15:56:362012-12-01 14:01:20login/bin/suNaN
22013-12-17 15:55:432012-12-01 05:54:35libtalloc2/usr/lib/x86_64-linux-gnu/libtalloc.so.2.0.7NaN
32013-12-17 15:55:432013-12-16 20:03:24libwbclient0/usr/lib/x86_64-linux-gnu/libwbclient.so.0
42013-12-17 15:55:422012-12-01 05:54:13libselinux1/lib/x86_64-linux-gnu/libselinux.so.1NaN

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

Сначала, посмотрим на всё с 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]:
atimectimepackage-namemru-programtag
572013-12-17 04:55:392013-12-17 04:55:42ddd/usr/bin/ddd
4502013-12-16 20:03:202013-12-16 20:05:13nodejs/usr/bin/npm
4542013-12-16 20:03:202013-12-16 20:05:04switchboard-plug-keyboard/usr/lib/plugs/pantheon/keyboard/options.txt
4452013-12-16 20:03:202013-12-16 20:05:04thunderbird-locale-en/usr/lib/thunderbird-addons/extensions/langpac...
3962013-12-16 20:08:272013-12-16 20:05:03software-center/usr/sbin/update-software-center
4492013-12-16 20:03:202013-12-16 20:05:00samba-common-bin/usr/bin/net.samba3
3972013-12-16 20:08:252013-12-16 20:04:59postgresql-client-9.1/usr/lib/postgresql/9.1/bin/psql
3982013-12-16 20:08:232013-12-16 20:04:58postgresql-9.1/usr/lib/postgresql/9.1/bin/postmaster
4522013-12-16 20:03:202013-12-16 20:04:55php5-dev/usr/include/php5/main/snprintf.h
4402013-12-16 20:03:202013-12-16 20:04:54php-pear/usr/share/php/XML/Util.php

Замечательно, это говорит о том, что установлен ddd. И postgresql! Круто.

Для вставки кода на Python в комментарий заключайте его в теги <pre><code class="python3">Ваш код</code></pre>
Опечатка в тексте:
Послать сообщение об ошибке автору?