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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

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

pandas

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

Q&A

解決済

2回答

1578閲覧

別年における同曜日を揃えてプロットする方法について

mi2

総合スコア63

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2020/09/17 02:02

編集2020/10/03 11:49

やりたいこと

以下のようなデータフレームがあったときに、2019年と2020年の2年分のplot方法について、
曜日をそろえてplotしたいと考えております。
横軸に1月1週目+曜日、1月2週目+曜日、…、縦軸にxが来るようにしたいのですが、2019年と2020年で1日の曜日が異なるためうまくplotができておりません。

<想定されるデータフレーム>

df date x 20190101 1 20190102 4 20190103 5 20190104 1 20190105 7 20200101 4 20200102 6 20200103 1 20200104 4 20200105 5

考えていること

           2019年 2020年 1月1週目月曜日      1月1週目火曜日 1 1月1週目水曜日 4 4 1月1週目木曜日 5 6 1月1週目金曜日 1 1 1月1週目土曜日 7 4 1月1週目日曜日 12 5 1月2週目月曜日 14 2 :

このような形で年がカラム、月日がインデックスになるような集計になる方法となるかと思いますが、
具体的な実装方法や集計のための関数のイメージがついておりません。

もし2つの曜日を揃えて横軸を上記のインデックスでプロットする方法についてお知恵を拝借できますと幸いです。
何卒よろしくお願い申し上げます。

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

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

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

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

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

guest

回答2

0

ベストアンサー

strftime関数の%V%uで週と曜日の連番が得られるので、これらをもとに新たに列を作成します。
次に元のテーブルを2019と2020年に分けて先ほどの列でマージします。
あとはマージした内容をそれぞれ描画すればよいです。

Python

1import matplotlib.pyplot as plt 2import pandas as pd 3 4df = pd.read_csv('inp.csv', sep='\t') 5df['date'] = pd.to_datetime(df['date'], format='%Y%m%d') 6 7df['wd'] = df['date'].dt.strftime('w%V_d%u') # 週と曜日の番号 8 9# 2019, 2020年で分割 10dt20 = pd.to_datetime('2020-01-01') 11df19 = df[df['date'] < dt20] 12df20 = df[df['date'] >= dt20] 13 14# 週と曜日の番号 で結合 15df = pd.merge(df19, df20, on='wd', how='outer') 16 17plt.plot(df['wd'], df['x_x']) # 2019 18plt.plot(df['wd'], df['x_y']) # 2020 19plt.xticks(rotation=90) 20plt.subplots_adjust(bottom=0.2) 21plt.show()

イメージ説明

投稿2020/09/17 04:57

can110

総合スコア38341

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

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

0

・io.StringIOとかは単にテスト用データ作成用
・["date"]列をdatetime型にしてから、isocalendar((年,週番号,曜日)のタプルを返す)でyear列(年)とweekday列((週番号,曜日))を作成
・weekday列をインデックスにセット
・year毎にx列を新しいdataframeに格納

python3

1import pandas as pd 2import io 3df = pd.read_table(io.StringIO(table), delimiter="\s+") 4df["date"] = pd.to_datetime(df["date"].astype(str), format="%Y%m%d") 5 6f_wd = lambda x: x.isocalendar()[1:] 7f_y = lambda x: x.isocalendar()[0] 8df["weekday"] = df["date"].apply(f_wd) 9df["year"] = df["date"].apply(f_y) 10df = df.set_index("weekday") 11 12df2 = pd.concat([df.query("year == 2019")["x"],df.query("year == 2020")["x"]],axis=1) 13df2.columns = ["2019年", "2020年"] 14print(df2) 15""" 16 2019年 2020年 171 2 1.0 NaN 18 3 4.0 4.0 19 4 5.0 6.0 20 5 1.0 1.0 21 6 7.0 4.0 22 7 12.0 5.0 232 1 14.0 2.0 24 2 28.0 23.0 25 3 23.0 12.0 26 4 12.0 51.0 27 5 41.0 52.0 28 6 4.0 21.0 29 7 65.0 2.0 303 1 1.0 3.0 31 2 4.0 53.0 32 3 6.0 33.0 33 4 9.0 21.0 34 5 53.0 42.0 35 6 2.0 21.0 36 7 6.0 24.0 374 1 7.0 12.0 38 2 15.0 1.0 39 3 2.0 24.0 40 4 6.0 2.0 41"""

投稿2020/09/17 04:42

jeanbiego

総合スコア3966

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問