Подтвердить что ты не робот

Может ли Pandas построить гистограмму дат?

Я взял свою серию и принудил ее к столбцу datetime dtype = datetime64[ns] (хотя нужно только разрешение дня... не знаю, как изменить).

import pandas as pd
df = pd.read_csv('somefile.csv')
column = df['date']
column = pd.to_datetime(column, coerce=True)

но построение графика не работает:

ipdb> column.plot(kind='hist')
*** TypeError: ufunc add cannot use operands with types dtype('<M8[ns]') and dtype('float64')

Я хотел бы построить гистограмму, в которой показывает количество дат по неделям, месяцам или годам.

Конечно, есть способ сделать это в pandas?

4b9b3361

Ответ 1

Учитывая это df:

        date
0 2001-08-10
1 2002-08-31
2 2003-08-29
3 2006-06-21
4 2002-03-27
5 2003-07-14
6 2004-06-15
7 2003-08-14
8 2003-07-29

и, если это еще не случай:

df["date"] = df["date"].astype("datetime64")

Чтобы показать количество дат по месяцам:

df.groupby(df["date"].dt.month).count().plot(kind="bar")

.dt позволяет вам получить доступ к свойствам datetime.

Что вам даст:

groupby date month

Вы можете заменить месяц на год, день и т.д.

Если вы хотите отличать год и месяц, например:

df.groupby([df["date"].dt.year, df["date"].dt.month]).count().plot(kind="bar")

Что дает:

groupby date month year

Это то, что вы хотели? Это ясно?

Надеюсь, это поможет!

Ответ 2

Я думаю, что resample может быть тем, что вы ищете. В вашем случае выполните следующие действия:

df.set_index('date', inplace=True)
# for '1M' for 1 month; '1W' for 1 week; check documentation on offset alias
df.resample('1M', how='count')

Он делает только счет, а не сюжет, поэтому вам нужно сделать свои собственные сюжеты.

См. это сообщение для получения дополнительной информации о документации resample pandas документация по перепрограммированию

Я столкнулся с такими же проблемами, как и вы. Надеюсь, это поможет.

Ответ 3

У меня тоже были проблемы с этим. Я полагаю, что, поскольку вы работаете с датами, вы хотите сохранить хронологическое упорядочение (как и я).

Обходной путь тогда

import matplotlib.pyplot as plt    
counts = df['date'].value_counts(sort=False)
plt.bar(counts.index,counts)
plt.show()

Пожалуйста, если кто-нибудь знает лучший способ, пожалуйста, говорите.

EDIT: для jean выше, здесь образец данных [я случайным образом выбран из полного набора данных, следовательно, тривиальные данные гистограммы.]

print dates
type(dates),type(dates[0])
dates.hist()
plt.show()

Вывод:

0    2001-07-10
1    2002-05-31
2    2003-08-29
3    2006-06-21
4    2002-03-27
5    2003-07-14
6    2004-06-15
7    2002-01-17
Name: Date, dtype: object
<class 'pandas.core.series.Series'> <type 'datetime.date'>

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-38-f39e334eece0> in <module>()
      2 print dates
      3 print type(dates),type(dates[0])
----> 4 dates.hist()
      5 plt.show()

/anaconda/lib/python2.7/site-packages/pandas/tools/plotting.pyc in hist_series(self, by, ax, grid, xlabelsize, xrot, ylabelsize, yrot, figsize, bins, **kwds)
   2570         values = self.dropna().values
   2571 
-> 2572         ax.hist(values, bins=bins, **kwds)
   2573         ax.grid(grid)
   2574         axes = np.array([ax])

/anaconda/lib/python2.7/site-packages/matplotlib/axes/_axes.pyc in hist(self, x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, **kwargs)
   5620             for xi in x:
   5621                 if len(xi) > 0:
-> 5622                     xmin = min(xmin, xi.min())
   5623                     xmax = max(xmax, xi.max())
   5624             bin_range = (xmin, xmax)

TypeError: can't compare datetime.date to float

Ответ 4

Я думаю, что для решения этой проблемы вы можете использовать этот код, он преобразует тип даты в типы int:

df['date'] = df['date'].astype(int)
df['date'] = pd.to_datetime(df['date'], unit='s')

только для получения даты, вы можете добавить этот код:

pd.DatetimeIndex(df.date).normalize()
df['date'] = pd.DatetimeIndex(df.date).normalize()

Ответ 5

Мне удалось обойти это с помощью (1) построения с использованием matplotlib вместо прямого использования dataframe и (2) с использованием атрибута values. Пример:

import matplotlib.pyplot as plt

ax = plt.gca()
ax.hist(column.values)

Это не работает, если я не использую values, но я не знаю, почему он работает.