Анализ данных с помощью 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]
Магия в обработке timestamp в pandas в том, что numpy datetime сохраняются, как Unix timestamp. Поэтому всё, что нам нужно - это сказать pandas, что эти целые числа - это datetimes - они не требуют каких-либо преобразований.
Сначала преобразуем в целые числа:
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'].dtype
Посмотрим на atime
и ctime
как на даты!
popcon[:5]
Теперь посмотрим на все пакеты, которые не являются библиотеками.
Сначала, посмотрим на всё с timestamp 0. Заметили, что мы можем использовать строку для сравнения, несмотря на то, что внутри находится timestamp? Поэтому pandas крут.
popcon = popcon[popcon['atime'] > '1970-01-01']
Теперь можно использовать магические способности pandas для строк, чтобы посмотреть, где имя пакета не содержит 'lib'.
nonlibraries = popcon[~popcon['package-name'].str.contains('lib')]
nonlibraries.sort_values('ctime', ascending=False)[:10]
Замечательно, это говорит о том, что установлен ddd. И postgresql! Круто.