私は自分のシリーズをdtype = datetime64[ns]
のdatetime列に強制しました(ただし、日の解決だけが必要です...変更方法はわかりません)。
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
でこれを行う方法はありますか?
この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プロパティにアクセスできます。
それはあなたに与えるでしょう:
月を年、日などで置き換えることができます。
たとえば、年と月を区別する場合は、次のようにします。
df.groupby([df["date"].dt.year, df["date"].dt.month]).count().plot(kind="bar")
与えるもの:
それはあなたが望んだものでしたか?これは明らかですか?
お役に立てれば !
リサンプルはあなたが探しているものだと思います。あなたの場合、以下を行います:
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 resample documentation
あなたと同じような問題に遭遇しました。お役に立てれば。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Create random datetime object."""
# core modules
from datetime import datetime
import random
# 3rd party modules
import pandas as pd
import matplotlib.pyplot as plt
def visualize(df, column_name='start_date', color='#494949', title=''):
"""
Visualize a dataframe with a date column.
Parameters
----------
df : Pandas dataframe
column_name : str
Column to visualize
color : str
title : str
"""
plt.figure(figsize=(20, 10))
ax = (df[column_name].groupby(df[column_name].dt.hour)
.count()).plot(kind="bar", color=color)
ax.set_facecolor('#eeeeee')
ax.set_xlabel("hour of the day")
ax.set_ylabel("count")
ax.set_title(title)
plt.show()
def create_random_datetime(from_date, to_date, Rand_type='uniform'):
"""
Create random date within timeframe.
Parameters
----------
from_date : datetime object
to_date : datetime object
Rand_type : {'uniform'}
Examples
--------
>>> random.seed(28041990)
>>> create_random_datetime(datetime(1990, 4, 28), datetime(2000, 12, 31))
datetime.datetime(1998, 12, 13, 23, 38, 0, 121628)
>>> create_random_datetime(datetime(1990, 4, 28), datetime(2000, 12, 31))
datetime.datetime(2000, 3, 19, 19, 24, 31, 193940)
"""
delta = to_date - from_date
if Rand_type == 'uniform':
Rand = random.random()
else:
raise NotImplementedError('Unknown random mode \'{}\''
.format(Rand_type))
return from_date + Rand * delta
def create_df(n=1000):
"""Create a Pandas dataframe with datetime objects."""
from_date = datetime(1990, 4, 28)
to_date = datetime(2000, 12, 31)
sales = [create_random_datetime(from_date, to_date) for _ in range(n)]
df = pd.DataFrame({'start_date': sales})
return df
if __== '__main__':
import doctest
doctest.testmod()
df = create_df()
visualize(df)
これを回避するには、(1)データフレームを直接使用する代わりにmatplotlibでプロットし、(2)values
属性を使用します。例を参照してください:
import matplotlib.pyplot as plt
ax = plt.gca()
ax.hist(column.values)
values
を使用しない場合、これは機能しませんが、なぜ機能するのかわかりません。
私もこれで問題を抱えていました。日付を操作しているので、時系列の順序を保持する必要があると思います(私がしたように)。
その場合の回避策は
import matplotlib.pyplot as plt
counts = df['date'].value_counts(sort=False)
plt.bar(counts.index,counts)
plt.show()
誰かがより良い方法を知っているなら、声を上げてください。
編集:上記のジャンのために、ここにデータのサンプルがあります[私は完全なデータセットからランダムにサンプリングしたので、些細なヒストグラムデータです。]
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
この問題を解決するには、このコードを使用して、日付型を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()