Найти в Дзене
Python Lounge

Анализ данных с помощью 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]: Магия в обработке timestamp в pandas в том, что numpy datetime сохраняются, как Unix timestamp. Поэтому всё, что нам нужно - это сказать pandas, что эти целые числа -

Часто данные содержат не только числовые или строковые значения, но и даты / время, причём в огромном множестве разных форматов. 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]:

Магия в обработке 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]:

-2

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

Сначала, посмотрим на всё с 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]:

-3

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