Python忘備録(基本、演算子、文字列、リスト、日付時刻、ファイル入出力)

Pythonクイックリファレンス

この記事では、Pythonのプログラムを作るときに、書き方などを思い出すための忘備録です。細かい説明は省いたクイックリファレンスとして、蓄積していきたいと思います。(内容は逐次更新します)

  1. Python基本
    1. 組み込み型
    2. Pythonの四則演算
    3. 複合演算子 a+=1 a-=1 a*=2 a/=3
  2. 文字列 シングルクォーテーション”、ダブルクオーテーション”” 改行付き”’ ”’
    1. 文字列の足し算、掛け算
    2. 文字を数値に変換 int(s) float(s)
    3. 数値を文字に変換 str(n)
    4. 文字列の長さを知る len(s)
    5. 文字列の検索と置換 文字列.find(検索文字列) 文字列.replace(検索文字、置換文字)
      1. 検索  s.find(search)
      2. 置換 s.replace(search,change)
  3. python標準リストとndarray(numpyライブラリーの配列)
    1. 標準リスト
    2. ndarray
    3. 標準リストの足し算、掛け算
    4. ndarrayの足し算、掛け算、割り算
    5. 標準リストの最大、最小、合計、平均
    6. ndarrayの最大、最小、合計、平均、標準偏差、分散、累積、その他
    7. 標準リストとndarrayの相互変換
  4. 日付時刻の扱い datetime型
    1. 日付時刻の文字列からdatetime型へ変換する方法
    2.  日付だけの文字列からdatetime型へ変換する方法
    3. datetime型を文字列にする方法
    4. datetime型から「年、月、日、時刻、分、秒、マイクロ秒、曜日」を取り出す
    5. 今日の日付を取得する(datetime型)
    6. 数値を指定して日付時刻を得る
    7. 日付時刻型(datetime型)から文字列に変換 ※ばらばらに取得もできるよ
    8. 日付の計算 差を求める
    9. 日付に日数や時間を加える
    10. 日付から1か月後、1年後、月末、月初、1週間後など
    11. 日付文字列を自動判別してdatetime型に変換(パーサーを使う方法)
  5. ファイル入出力
    1. 一般的なフィル出力の構造(書き込み)
    2. 一般的なファイル入力の構造(読み込み)
    3. withを使ったファイル出力の構造
    4. withを使ったファイル入力の構造
    5. 追記型はモードをaにする
    6. ファイルにリストを出力する方法
    7. エンコードを指定して(文字コード)ファイルを出力
    8. エンコードを指定して(文字コード)ファイルを入力
    9.  デフォルトのエンコードと一致しているときは省略してもエラーが出ない
    10. エンコード(文字コード)調べる方法
  6. pandasについて
    1. 列を削除する df.drop[‘列名’ , axis=1 , inplace=True]
    2. データフレームを結合する df3=pd.concat([df1,df2])

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])

 

 

 

 

コメント