🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

Q&A

解決済

1回答

844閲覧

Pandasでindex=年,columns=月日時間のdataframe作成

barobaro

総合スコア1286

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

0グッド

0クリップ

投稿2019/11/01 14:04

編集2019/11/02 13:14

前提・実現したいこと

極値理論を使って多摩川の氾濫は推測できたのか検証してみる
https://qiita.com/hrkz_szk/items/3b17a45f9e8c55634597

を参考に多摩川の水位をスクレイピングしたのですが
年毎の水位を表示したいのですがうまくいきません。

年でグループ化はできたのですが一緒にplotすると年があるため続きに表示されてしまいます。

イメージ説明

年、月日時間で分けることができたら表示できると思うのですが
Pandasでindex=年,columns=月日時間のdataframe作成の仕方を教えてください。

|year|01-01 1:00|01-01 2:00|01-01 3:00|01-01 4:00|…|12-31 24:00|
|:--|:--:|--:|--:|--:|--:|
|2000|||||||
|2001|||||||
|2002|||||||
|2003|||||||

該当のソースコード

スクレイピング

python

1import pandas as pd 2from tqdm import tqdm_notebook 3import time 4 5years = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019] 6 7dfs = [] 8 9for year in tqdm_notebook(years): 10 for month in tqdm_notebook(range(1, 13), desc=str(year)): 11 12 data = pd.read_html(f"http://www1.river.go.jp/cgi-bin/DspWaterData.exe?KIND=2&ID=303051283310030&BGNDATE={year}{month:02}01&ENDDATE=20191231&KAWABOU=NO", skiprows=1, header=0, index_col=0, na_values=["欠測", "閉局"]) 13 dfs.append(data[1].iloc[:-1,:]) 14 15 time.sleep(1) 16 17df = pd.concat(dfs) 18 19df.to_csv("result.csv")

整形

python

1df1 = pd.read_csv("result.csv", parse_dates=["date"], names=["date", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24], header=None, skiprows=1) 2 3df2 = pd.melt(df1, id_vars='date', var_name='hour', value_name='level') 4df2 = df2.sort_values(['date','hour']).reset_index(drop = True) 5 6import datetime 7 8df2["datetime"] = pd.to_datetime(df2["date"] + df2["hour"].apply(lambda x: datetime.timedelta(hours=x))) 9df2.set_index("datetime", inplace=True) 10df2["level"].plot(figsize=(15,5))

試したこと

年ごとのグループを作成

python

1df3 = df2["level"].copy() 2df3 3df_year = [g for n, g in df3.groupby(pd.Grouper(freq="Y"))] 4 5ax = df_year[18].plot(figsize=(15,5)) 6df_year[19].plot(figsize=(15,5), ax=ax)

イメージ説明

補足情報(FW/ツールのバージョンなど)

google colaboratory

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

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

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

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

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

meg_

2019/11/02 07:07

表現したいグラフはどのようなものですか?
barobaro

2019/11/02 13:06

返事が遅くなりすみません。 xが月日時間、yが水位で年毎のグラフを作成したいです。 nomukenさんのコードで作成できましたので画像追加しておきます。
guest

回答1

0

ベストアンサー

こんな感じでしょうか

Python

1import pandas as pd 2import numpy as np 3 4df1 = pd.read_csv("result.csv", parse_dates=["date"], names=["date", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24], header=None, skiprows=1) 5 6df2 = pd.melt(df1, id_vars='date', var_name='hour', value_name='level') 7df2 = df2.sort_values(['date','hour']).reset_index(drop = True) 8 9import datetime 10 11df2['year'] = pd.to_datetime(df2['date']).apply(lambda x: x.year) 12df2['mmddhhmm'] = df2[['date', 'hour']].apply(lambda x: '{0:s} {1:02d}:00'.format(pd.to_datetime(x[0]).strftime('%m-%d'), x[1]), axis=1) 13 14print(df2) 15""" 16 date hour level year mmddhhmm 170 2010-01-01 1 3.23 2010 01-01 01:00 181 2010-01-01 2 3.23 2010 01-01 02:00 192 2010-01-01 3 3.22 2010 01-01 03:00 203 2010-01-01 4 3.22 2010 01-01 04:00 214 2010-01-01 5 3.22 2010 01-01 05:00 22... ... ... ... ... ... 2387643 2019-12-31 20 NaN 2019 12-31 20:00 2487644 2019-12-31 21 NaN 2019 12-31 21:00 2587645 2019-12-31 22 NaN 2019 12-31 22:00 2687646 2019-12-31 23 NaN 2019 12-31 23:00 2787647 2019-12-31 24 NaN 2019 12-31 24:00 28 29[87648 rows x 5 columns] 30""" 31 32df3 = pd.pivot_table(df2, values='level', index='year', columns='mmddhhmm') 33print(df3) 34""" 35mmddhhmm 01-01 01:00 01-01 02:00 01-01 03:00 01-01 04:00 ... 12-31 21:00 12-31 22:00 12-31 23:00 12-31 24:00 36year ... 372010 3.23 3.23 3.22 3.22 ... 2.07 2.07 2.07 2.07 382011 2.07 2.07 2.07 2.08 ... 3.23 3.23 3.24 3.24 392012 3.23 3.23 3.23 3.23 ... 3.27 3.25 3.28 3.29 402013 3.29 3.29 3.28 3.28 ... 3.23 3.24 3.24 3.25 412014 3.25 3.24 3.24 3.24 ... 3.26 3.26 3.26 3.25 422015 3.26 3.25 3.25 3.25 ... 3.25 3.25 3.25 3.25 432016 NaN 3.25 3.25 3.25 ... 3.27 3.27 3.27 3.27 442017 3.27 3.27 3.27 3.27 ... 3.19 3.19 3.19 3.19 452018 3.19 3.19 3.19 3.19 ... 3.22 3.22 3.22 3.22 462019 3.22 3.22 3.22 3.22 ... NaN NaN NaN NaN 47 48[10 rows x 8784 columns] 49"""

投稿2019/11/02 07:51

nomuken

総合スコア1627

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

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

barobaro

2019/11/02 13:09

グラフも無事作成することができました。 年と月日時間の処理方法がわからなかったので勉強になりました。 どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問