Анализ данных с помощью pandas. Часть 7: работа с датами и временем
Часто данные содержат не только числовые или строковые значения, но и даты / время, причём в огромном множестве разных форматов. pandas умеет работать с датами; в этой части будет показано, как.
Unix timestamps
Самый распространённый формат в Unix. Неочевидно, что делать с Unix timestamp в pandas. Файл, который мы будем использовать - "popularity-contest", найденный в папке /var/log/popularity-contest. Что это за файл?
%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) # Размер картинок# 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']popcon[:5]| 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, что эти целые числа - это 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 о том, что они означают.
popcon['atime'] = pd.to_datetime(popcon['atime'], unit='s')
popcon['ctime'] = pd.to_datetime(popcon['ctime'], unit='s')Посмотрим на dtype, он M8 это секретный код для datetime64.
popcon['atime'].dtypedtype('
Посмотрим на atime и ctime как на даты!
popcon[:5]| 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')]nonlibraries.sort_values('ctime', ascending=False)[: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! Круто.


LETPY.COM