質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

3回答

23593閲覧

pandasのdatetimeをdateに変換したい

barobaro

総合スコア1286

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

1グッド

1クリップ

投稿2018/06/21 14:38

編集2018/06/22 02:54

シフト表を作っているのですが確認のため24時間中に漏れや重複がないか
startの日付でtimeを合計し24より減(漏れ)・増(重複)がないかをグラフにして確認しています。
他に確認するいい方法があれば教えて欲しいのですが

質問1
datetimeからdateに変換する方法教えてください。
datetimeindexにするとdateにできるのですがdatetimeindexにしなくても変換する方法があれば教えてください。

python

1import io 2import pandas as pd 3import numpy as np 4 5data = """ 6name start end 7a 2018/06/01 9:00:00 2018/06/01 18:00:00 8b 2018/06/01 18:00:00 2018/06/02 9:00:00 9c 2018/06/02 9:00:00 2018/06/02 18:00:00 10d 2018/06/02 18:00:00 2018/06/02 21:00:00 11e 2018/06/02 21:00:00 2018/06/03 9:00:00 12a 2018/06/03 9:00:00 2018/06/04 9:00:00 13b 2018/06/04 9:00:00 2018/06/04 18:00:00 14c 2018/06/04 18:00:00 2018/06/05 9:00:00 15""" 16pd.read_table(io.StringIO(data), sep="\s{4}", parse_dates=['start', 'end'], engine='python') 17 18df['time'] = df['end'] - df['start'] 19 20# indexに設定後、dateを取得 21df2 = df.set_index('start') 22df2['date']=df2.index.date 23 24table = pd.pivot_table(df2, values='time', index=['date'], aggfunc=np.sum) 25table.plot.barh()

イメージ説明

nameで色分けできたらと思い

python

1table = pd.pivot_table(df2, values='time', index=['date'], columns=['name'], aggfunc=np.sum) 2table.plot.barh(stacked=True)

にしたのですが

TypeError: Cannot cast ufunc greater input from dtype('<m8[ns]') to dtype('<m8') with casting rule 'same_kind'

というエラーがでます。

質問2
stacked=Trueにしなければエラーはでないのですが積み上げにはできないのでしょうか

よろしくお願いします。

hayataka2049👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2018/06/21 14:56

teratailの仕様でtabが半角スペース4つに変換されているので、コピペして動かすにはdf = pd.read_table(io.StringIO(data), sep="\s{4}", parse_dates=['start', 'end'], engine='python')みたいな感じにする必要がありました。でも、strで定義していただいたことはとてもありがたいです
barobaro

2018/06/21 22:55

すみませんコピペするときに変換されたみたいです。修正しておきます。
barobaro

2018/06/21 23:00

編集しようとしましたが元データはTABになっているので表示されるときに変換されるようです。
guest

回答3

0

ベストアンサー

【質問1】
datetime型のColumnからdateを取得するにはDatetime Accessor dtを使って
df['start'].dt.date
で良いかと思います。

【質問2】
原因を詳しく追ったわけではありませんが、現在 time列timedelta64[ns]型の為、計算で扱う数値が大きくなりすぎるのかもしれません
とりあえず、time列

Python

1df['time'] = (df['end'] - df['start']).astype('timedelta64[s]')

として秒単位に変換することで問題なくグラフが表示されました。
ただ今回の場合は

Python

1df['time'] = (df['end'] - df['start']).astype('timedelta64[s]') / 3600

などとして1時間単位で計算したほうが横軸が判りやすくなるかもしれません

投稿2018/06/22 00:46

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

barobaro

2018/06/22 01:11

サンプルの時間単位ではなく分単位で変換しましたが思った通りの表示ができました。 エラー内容は同じ型なのにどうしてかと思ってましたが数値が大きいからなんですね。 Datetime Accessorを使えば日付関連のはクリアできそうです。 どうもありがとうございます。 http://sinhrks.hatenablog.com/entry/2014/10/30/233606
guest

0

日付単位で集計するならdatetimeからdateに変換しなくてもresampleを使えばできました。
ただnameも一緒に結合されますが

python

1df2 = df.set_index('start') 2s = df2.resample('D').sum() 3s.plot.barh()

イメージ説明

投稿2018/06/22 01:44

編集2018/06/22 01:45
barobaro

総合スコア1286

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問1については

python

1df["date"] = pd.DatetimeIndex(df["start"]).date

でいいかと。

質問2については、ちょっとすぐ回答が思いつかないので、日が登ってから(思いつけば、そして他の人が回答して解決済みにならなければ)追記すると思います。

投稿2018/06/21 15:27

編集2018/06/21 15:28
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

barobaro

2018/06/21 23:03

ありがとうございます。 DatetimeIndexに直接設定すればいいのですね。 その方法にたどり着けなかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問