【Python】エクセルファイルを開いて、適当にデータを整形して取り出す方法【稲城市のデータだけどね】

便利な言語 Python

ライブラリーとかが豊富だし、なにより、Jupyter Notebookという使いやすい実行環境があったり、BinderGoogle Colabというクラウド上で無料で動かせる環境があったりするので、プログラミングを勉強するにはとてもいいと思います。

Binder Google Colabについては、こちらの記事で

【Cloud利用】Binder, Google colab が便利なので、ちょっとしたTips集【Python】
プログラマー増えませんね(笑) CivicTechと言いながら、あまりプログラマー増えません。。 居なければ、自分たちでプログラミングもや...

この前、ゴミ出しの日をPythonで少しいじったのですが。。

【ゴミ収集】明日はなんのゴミだっけ?ゴミ情報を知る方法【こだいら】
小平のゴミ収集 2019年4月から有料化とともに収集方法も変わりました。 で。。 これまで、ボランタリーに更新してくれていた...

今回は、CivicTech Forumで出会った稲城市で活動されている方が、「市の子育て情報がエクセルで、しかも。。エクセルをお絵描きのような使い方をしているのでデータを抜き出せない」という話をされていたので、少しデータ整形をしてみようかと。。

確かに。。お絵描きのように使っていますね。。

でも必要なデータは、取り出せそうな形をしていそうです(笑) 小平よりはいいような感じ(笑) ちなみに、うちのメンバーが小平市にPDFで出ている情報を、テキストでほしいと言ったら、「データが改ざんされる恐れがあるため、PDFで出している」とのこと(笑) おい!君たち、公共のデータは、二次利用されるためにあるんじゃないのか?(笑) 今度、子育て関係の市役所の人に、言ってみよう(笑)<ん?(笑)

で。。稲城市用ですが。。作ってみました。

ソースを全部見てもらえば、Jupyter-notebook形式で、コメントも入れているので。。わかるかと(笑)

カレンダーから、日時を指定すれば、場所とイベント内容が取り出せるようにしてあります。

PandasでExcelファイル開けます

こちらが、Google Colabで、実行できるファイルです。Jupyter-notebook形式です。

Google Colab

Githubにも乗せておきました。

Googlecolabutils/PythonExcel_internet.ipynb at master · tom2rd/Googlecolabutils
Google colab tips. Contribute to tom2rd/Googlecolabutils development by creating an account on GitHub.

で。。。ファイルを開く部分は、たったこれだけです。

import pandas as pd
import urllib

link = 'https://www.city.inagi.tokyo.jp/kosodate/kodomoshien_center/event/baby.files/201909yanokutiositate.xlsx'
socket = urllib.request.urlopen(link)
xls = pd.ExcelFile(socket)
df = xls.parse(xls.sheet_names[0], header=None, index_col=None)
df

Pandas というデータ分析用のライブラリを使います。urllibは、インターネット上のファイルなどを操作するのに必要なライブラリです。

たったこれだけで、エクセルファイルが、Dataframe形式で読み込まれます。

このQuitaの記事が、よくまとまっていると思います。

Pandasのよく使う機能まとめ - Qiita
業務でデータ解析する時にPythonとPandasを使うと凄く楽だな~と思ったので、よく使う機能を備忘録的にまとめてみる準備インストールとりあえずPandasがないと始まらないので、インストー…

普通のリストに取り込み

Pythonの場合、文字列っていう概念が、配列そのものになっていたりするので、僕のようなおじさんの頭では、少し頭の切り替えが必要ですが。。Dataframe形式のものから一度、普通のリスト形式に取り込んでおくと、あとは文字列の切り取りだけで、いろいろやれるので、便利です(笑)

evlist=[]
cc=df.loc[1]

for i in range(2,7):
 dd=df.loc[i]
 for j inrange(7):
  ifstr(dd[j]) != 'nan':
   evlist.append(str(cc[j]) + " " + str(dd[j]))
evlist

もとのファイルは、一週間分で、取り込んだDataframeから1行分を取り出して、日~土の文字列をとりだしています。そして、その次の行から1行づつ取り出し、今度は、その中で nanとなっている文字以外のものを取り出して、曜日を入れて、evlistという配列に追加しているだけです。そうすると、1日から月の終わりの日にちまでの配列evlistができています。

loc とか、ilocとかは、↑のQuitaの記事にも書かれていますね。

ちなみに、nanって何なんや???って思ったのですが、Numpyというデータ分析用のライブラリーでのNAと同じで、何も数字が入っていないよ!っていう意味だそうです。実は、これをif文で削除するのに、少し手間取りました(笑) まさか文字列にして出すと、そのままnanが出てくるとは思わなかったので、これは???なんなん?って(笑)

データの取り出し

配列の操作と、文字列の操作 を 調べるといいです。

ちなみに、「Python 文字列 操作」や 「Python 配列 操作」 などで検索するとQuitaなどの記事が出てくるので、それらを見るといいと思います。このあたりは、自分で調べてみると、勉強になるというか。。僕もいつも調べています(笑)

datedate=17
datedate=datedate-1
print(str(evlist[datedate]).replace('\u3000',' ').split()[1]+" 日")
print(str(evlist[datedate]).replace('\u3000',' ').split()[0]+" 曜日")
print(str(evlist[datedate]).replace('\u3000',' ').split('\n')[1::])

17日のイベントを取り出したい場合は、この一番下の行を見てみてください。

稲城市のファイルでは、改行(¥n)が、曜日 スペース 日 改行 場所 イベント 改行・・・という組み合わせで入っているので、一個目の¥n以降を取り出すと、場所 イベントの組み合わせで抽出できます。

これって何気に便利で、evlistの17番目(配列は0から始まるので、17日だと16なんですが)を取り出して、不要な文字\u3000(全角スペース)を取り除き、¥n(改行)で区切った2つ目以降を取り出す。っていう意味を、一行で書いています。

str(evlist[datedate]).replace('\u3000',' ').split('\n')[1::]

まぁ、普通の言語でいうと文法みたいなものですね。。

ひとつひとつ勉強してからやろうとすると、勉強するだけで挫折しちゃうかもしれないですが、こんな風に、やりたいことがあって、コピペでプログラミングから始められるのが、Pythonのいいところかもしれません。

イベント情報はiCal形式で出してほしい!!

Pythonからは外れますが、ゴミ出しにせよ、子育てのイベント情報にせよ。。二次利用できると、自分のスマホのカレンダーにコピーしておいたり、各種イベントを整理しているようなサイトなどが、紹介できたりと。。非常に便利になります。Pythonで取り出すなんてことしなくてもよくなる方法は、カレンダーのデータ形式です。iCal(iCalender)という形式があります。

この形式で出してほしいなぁ~~ そうすれば、Googleカレンダーや、iPhoneのカレンダーにすぐに読み込める。

イベントを作成する方は、きっと、多くの人に来てほしいんだと思うんです。

来てくれる方のカレンダーに、ぽちっとするだけで、取り込めるようにしておくといいと思うんですけどねぇ~~(笑)

世の中には、こんなサービスもあるってことは、やはりみんな使ってるのですよね(笑)

https://tom2rd.sakura.ne.jp/wp/2019/07/16/post-9542/

追記!!小平市のHPにカレンダーに登録ボタンがあった!!

市の広報室からのタレコミです(笑)<ちゃうか?

なんと!!!

カレンダーに登録ボタン がついていて、これがical形式(.icsファイル)です。Googleカレンダーや、Outlook、Macのカレンダーにも、ダウンロードで読み込めます!!

とってもいい!!

あと少し! ICS形式の中に LOCATION のデータが入っていません。せっかくイベントの詳細ページでは、場所も記入されているので、LOCATIONも入れるといいですね!

あと少し! ひとつづつのイベントで、ひとつのICSファイルになっています。これが、全部一括で読み込めると、いいですね。BEGIN:VEVENTから、END:VEVENTまで羅列して、その前後にBEGIN:VCALENDERとEND:VCALENDERを入れるだけなのに!おしい。

Google Spread Sheetでできないかやってみましたが、IMPORTXMLの数が多くなりすぎるのでその処理まではできませんでした。でも、全部の公開されているICSファイル名(URL)を取り出せるようにしておきました。参考にどうぞ! こちら

あと少し!これゴミのカレンダーもこの形式で出してくれるとありがたいなぁ~~

でも! 市役所の中の人でiCal形式のファイルがわかる人がいて。。ちょっとうれしい(笑)