この記事では、Pythonのプログラムを作るときに、書き方などを思い出すための忘備録です。細かい説明は省いたクイックリファレンスとして、蓄積していきたいと思います。(内容は逐次更新します)
Python基本
組み込み型
数値:数を表現するデータ型。整数型と浮動小数点型がある。ex)整数 123 浮動小数点 3.141592 16進数 0xFF(255)
文字列:文字を並べたテキストデータ。ex) ‘abc’ “あいうえお” ‘日本語漢字’ ダブルクォーテーションかシングルクォーテーションで囲む
リスト:複数の要素を格納するデータ型。数値、文字列、リストをリストに入れることができる。ex) [1,2,3] [“abc”,123,[4,5]]
タプル:リストと同じで配列のデータ型だが、要素の追加や変更ができない。
辞書 :キーとデータで構成されたリストのようなデータ型。キーで要素にアクセスすることができる。ex){‘abc’:’アルファベット’,’pencile’:’鉛筆’,’boy’:’少年’}
Pythonの四則演算
足し算 + 1+2
引き算 - 5-3
掛け算 * 2*4
割り算 / 10/2 →5
累乗 ** 2**4 →16
複合演算子 a+=1 a-=1 a*=2 a/=3
a=a+1 → a+=1
a=a-1 → a-=1
a=a*2 → a*=2
a=a/5 → a/=5
※未定義の変数には使えないことに注意
文字列 シングルクォーテーション”、ダブルクオーテーション”” 改行付き”’ ”’
s='abc' s="12345" s='This is "an apple" ' s="This is 'an apple' " s=''' abc 123 def '''
文字列の足し算、掛け算
s1 = ‘abc’
s2 = ‘123’
s3 = s1 + s2 #abc123
s4 = ‘@’ * 10 #@@@@@@@@@@
文字を数値に変換 int(s) float(s)
num_s=’123′
num = int(num_s) #123
num = float(num_s) #123.0
数値を文字に変換 str(n)
num_s = str(123) # “123”
文字列の長さを知る len(s)
s = ‘12345’
n = len(s) # 5
文字列の検索と置換 文字列.find(検索文字列) 文字列.replace(検索文字、置換文字)
検索 s.find(search)
s=’123-456-789-123-456-789′
seach_s=’45’
n = s.find(search_s) #n=4 (5番目)
n = s.find(search_s,5) #n=16 (17番目)
置換 s.replace(search,change)
s=’123-456-789-123-456-789′
seach_s=’45’
s2 = s.replace(search_s,’置換’) #123-置換6-789-123-置換6-789
python標準リストとndarray(numpyライブラリーの配列)
標準リスト
これが、pythonの標準リスト。数値でも文字列でもリストの中のリストもOK、オブジェクトをリストに入れるのでもいい。
x=[1,2,3,4,5]
y=[‘a’,’b’,’c’]
z=[1,2,3,’a’,[3,5,7]] このような混在もできる
ndarray
そして、ndarrayは、numpyのインポートが必要。そして、すべて同じ型でないとだめ。
import numpy as np
xn=np.array([1,2,3,4,5])
標準リストの足し算、掛け算
x1=[1,2,3]
x2=[4,5,6]
この二つのリストを足し算すると
x3 = x1 + x2
x3 = [1,2,3,4,5,6]
となる
このリストに整数を掛けると
x4 = x1*3
x4=[1,2,3,1,2,3,1,2,3]
繰り返しが起こる
x1*x2のようなリスト同士の掛け算はエラーになる
ndarrayの足し算、掛け算、割り算
xn1 = [1,2,3]
xn2 = [4,5,6]
このふたつのndarrayを足し算すると、
xn3 = xn1 + xn2
xn3 = [5,7,9]
整数倍してみると
xn4 = xn1*3
xn4 = [3,6,9]
となる
xn5 = xn1*xn2
のようにndarray同士の掛け算は
xn5=[4,10,18] #[1*4,2*5,3*6] 要素同士の掛け算が行われる
割り算も要素同士の割り算になる
xn6 = xn1/xn2
xn6 = [0.25,0.4 ,0.5] #[1/4,2/5,3/6]
標準リストの最大、最小、合計、平均
x=[1,2,3]
最大 → max(x)
最小 → min(x)
合計 → sum(x)
平均 → sum(x)/len(x)
ndarrayの最大、最小、合計、平均、標準偏差、分散、累積、その他
xn = np.array([1,2,3])
最大 → xn.max() →3
最小 → xn.min() →1
合計 → xn.sum() →6
平均 → xn.mean() →2.0
標準偏差 → xn.std() いわゆるσ 0.816
分散 → xn.var() → 0.666
累積 → xn.cumsum() → [1,3,6]
中央値 → np.median(xn)
分位点 → np.percentile(xn, q=[0,25,50,75,100]) 知りたい分位点をパーセントで指定 →リストで返えす
標準リストとndarrayの相互変換
標準リストを x = [1,2,3] とする
import numpy as np
標準リスト → ndarrayへの変換 xn = np.ndarray(x)
ndarray → 標準リストへの変換 x = xn.tolist()
日付時刻の扱い datetime型
datetime関連のライブラリーをインポートします。
from datetime import datetime,date,timedelta from dateutil.relativedelta import relativedelta import dateutil.parser
from dateutil.relativedelta import relativedelta
これは、日付の計算をするときに必要です。
import dateutil.parser
これは、文字列を日付に変換するときに便利です。(日付形式が混合しているデータやフォーマットが予想できない場合に使うと役立ちます。)
日付時刻の文字列からdatetime型へ変換する方法
#日付時刻文字列からdatetime型へ date_str='2020-9-12 12:30:50.123456' date_dt = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S.%f')
日付だけの文字列からdatetime型へ変換する方法
#日付だけの文字列からdatetime型へ date_str2='2020-9-12' date_dt2 = datetime.strptime(date_str2, '%Y-%m-%d')
datetime型を文字列にする方法
#datetime型からは、いろんなフォーマットで文字列にできる print(date_dt) print(date_dt.strftime('%Y/%m/%d')) print(date_dt.strftime('%Y-%m-%d')) print(date_dt.strftime('%Y.%m.%d'))
datetime型から「年、月、日、時刻、分、秒、マイクロ秒、曜日」を取り出す
#年を取り出す print(date_dt.year) #月を取り出す print(date_dt.month) #日を取り出す print(date_dt.day) #時間を取り出す print(date_dt.hour) #分を取り出す print(date_dt.minute) #秒を取り出す print(date_dt.second) #マイクロ秒を取り出す print(date_dt.microsecond) #曜日を取り出す weekday():月曜日が0 日曜日が6 print(date_dt.strftime('%a')) #Mon,Tue など短縮形 print(date_dt.strftime('%A')) #Monday,Tuesday など完全系 print(date_dt.weekday()) print('月火水木金土日月'[date_dt.weekday()]) #オリジナルの曜日表現もできる print(['Mon','Tue','Wed','Thu','Fri','Sat','Sun'][date_dt.weekday()])
今日の日付を取得する(datetime型)
#今日の日付時刻を取得 dt_now=datetime.now() print(dt_now)
数値を指定して日付時刻を得る
dt1=datetime(2020,9,12,14,5,30,123456) print(dt1) dt1=datetime(2020,9,12,14,5) print(dt1) dt1=datetime(2020,9,12) print(dt1)
日付時刻型(datetime型)から文字列に変換 ※ばらばらに取得もできるよ
#日付時刻型から文字列に変換 dt_now=datetime.now() print(dt_now.strftime('%Y-%m-%d %H:%M:%S.%f')) print(dt_now.strftime('%Y-%m-%d %H:%M:%S')) print(dt_now.strftime('%Y-%m-%d')) #年月日時分秒マイクロ秒すべてばらばらに取り出せる print(dt_now.strftime('%Y')) print(dt_now.strftime('%m')) print(dt_now.strftime('%d')) print(dt_now.strftime('%H')) print(dt_now.strftime('%M')) print(dt_now.strftime('%S')) print(dt_now.strftime('%f'))
日付の計算 差を求める
#日付の計算 差を求める dt1=datetime(1964,11,20) dt_now=datetime.now() dt2=dt_now-dt1 print(dt2) print(dt2.days)#日数 print(dt2.total_seconds())#秒 print(dt2.total_seconds()/3600)#時間 print(dt2.total_seconds()/3600/24)#日数を秒から計算 print(dt2.total_seconds()/3600/24/365.25)#年
日付に日数や時間を加える
#日付に日数や時間を加える dt1=datetime(1964,11,20) print(dt1) dt1 += timedelta(days=1) print(dt1)
日付から1か月後、1年後、月末、月初、1週間後など
#1か月後、1年後、月末、月初など #1か月後 dt1=datetime(1964,11,20) dt1 += relativedelta(months=1) print(dt1) #1年後 dt1=datetime(1964,11,20) dt1 += relativedelta(years=1) print(dt1) #月末 dt1=datetime(1964,11,20) dt1 = dt1 + relativedelta(months=1) - timedelta(days=dt1.day) print(dt1) #3年9か月と2日後 dt1=datetime(1964,11,20) dt1= dt1 + relativedelta(years=3,months=9,days=2) print(dt1) #月初 dt1=datetime(1964,11,20) dt1= dt1 -timedelta(days=dt1.day-1) print(dt1) #月初別解 dt1=datetime(1964,11,20) dt1= dt1 + relativedelta(day=1) print(dt1) #月末別解 dt1=datetime(1964,11,20) dt1= dt1 + relativedelta(day=32) print(dt1) #1週間後 dt1=datetime(1964,11,20) dt1= dt1 + timedelta(weeks=1) print(dt1)
日付文字列を自動判別してdatetime型に変換(パーサーを使う方法)
#パーサー 形式を自動で判別してくれる print(dateutil.parser.parse('2018/12/20')) #標準 print(dateutil.parser.parse('12/20/2018')) #アメリカ式 print(dateutil.parser.parse('20/12/2018')) #イギリス式 print(dateutil.parser.parse('2018.12.20')) #例外 print(dateutil.parser.parse('Dec 20th 2018')) # print(dateutil.parser.parse('20th Dec 2018')) #
ファイル入出力
ここでは、テキストファイルの入出力の仕方をご紹介します
一般的なフィル出力の構造(書き込み)
f=open('test.txt','w') f.write('ファイル出力例です\n') f.close()
一般的なファイル入力の構造(読み込み)
f=open('test.txt','r') s=f.read() print(s) f.close()
withを使ったファイル出力の構造
with open('test.txt','w') as f: f.write('ここに書き込むテキストを記述します\n')
withを使ったファイル入力の構造
with open('test.txt','r') as f: print(f.read())
追記型はモードをaにする
with open('test.txt','a') as f: f.write('ここに追記するテキストを記述します\n(追記型)\n')
ファイルにリストを出力する方法
s_list=['a','123','hello'] s_list=[r+'\n' for r in s_list] #要素にすべて改行コード(\n)を付加する with open('test.txt','w') as f: f.writelines(s_list)
※改行コードを付加していくことをよく忘れるので、ご注意を。この例では、リスト内包表記ですべての要素に改行コード(\n)を付けています。
エンコードを指定して(文字コード)ファイルを出力
with open('test.txt','w',encoding='utf-8') as f: f.write('enco-deを指定して、ここに書き込むテキストを記述します\n')
エンコードを指定して(文字コード)ファイルを入力
with open('test.txt','r',encoding='utf-8') as f: print(f.read())
デフォルトのエンコードと一致しているときは省略してもエラーが出ない
with open('test.txt','w',encoding='shift-jis') as f: f.write('enco-deを指定して、ここに書き込むテキストを記述します\n') with open('test.txt','r') as f: print(f.read())
※このパソコンのデフォルトのエンコードがshift-jisであるため、ファイル読み込み時にエンコードを省略してもエラーが発生していません。
エンコード(文字コード)調べる方法
ライブラリーをインストールする必要がありますが、インストールはpipを使って簡単にできます。
自分で出力したファイルを自分で読み込む場合には、あまり問題となりませんが、他人の出力されたファイルはshift-jisであったり、utf-8であったりとトラブルは何かをあるものです。この文字コードを調べる方法をひとつもっておくと便利です。
pip install chardet
でOKです
import chardet with open('test.txt', 'rb') as f: for binary in f: enc2 = chardet.detect(binary) print(enc2)
出力例:
{‘encoding’: ‘SHIFT_JIS’, ‘confidence’: 0.99, ‘language’: ‘Japanese’}
最初に文字コードが出てきているのがわかります。
辞書型なので、文字コードだけ取り出すには
print(enc2['encoding'])
のように辞書の要素を取り出せます。
pandasについて
import pandas as pd
これで、pdでライブラリーが使えます。
フレームデータをdfという変数名として、説明します。
列を削除する df.drop[‘列名’ , axis=1 , inplace=True]
df.drop['列名' , axis=1 , inplace=True] df2=df.drop['列名' , axis=1]
inplace=Trueで、元のdfを変更できる
データフレームを結合する df3=pd.concat([df1,df2])
df3=pd.concat([df1,df2])
コメント