Анализ данных часто подразумевает наличие не только чисел или строк, но и даты или времени в разнообразных форматах. pandas предоставляет возможности для работы с датами; в данном разделе рассматриваются эти возможности.
Unix timestamps
Формат Unix timestamps широко используется в Unix-системах. В pandas работа с Unix timestamp может показаться сложной. Мы будем работать с файлом "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) # Размер картинок
# Чтение файла и удаление последней строки
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, что эти числа означают дату - они не нуждаются в трансформациях.
Начнем с преобразования в целые числа:
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 о значении данных, не изменяя их содержимого.
popcon['atime'] = pd.to_datetime(popcon['atime'], unit='s')
popcon['ctime'] = pd.to_datetime(popcon['ctime'], unit='s')
Проверим тип данных atime и ctime. М8 - это скрытое обозначение для datetime64.
popcon['atime'].dtype
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. Очень полезно.