仕事メモとか

仕事中に調べた情報とか知ったことをメモしています。
unixコマンド, vim, oracle, putty, postgresql, bash, EXCEL, python, SQL全般 など。
最近は tableau, movabletype とかも触ったりしています。
雑な読書感想とかはこちら

カテゴリ: Python

文字コードをいい感じに揃える、str.normalize('NFKC')

プログラムを見ていたら、なんか呪文のように使ってる場所があって、あんまり気にせずコピペしていましたが、新ためてどういう意味なのか調べました。

{df}.{data}.str.normalize('NFKC')

調べてみたら、KCタイプの文字変換だったようです。
すっごい平たくいうと、半角カタカナとか混じっていても、一旦要素分解して、比較できる全角にするから比較しても大丈夫、という代物でした。


参考:
https://ja.wikipedia.org/wiki/Unicode%E6%AD%A3%E8%A6%8F%E5%8C%96
https://japandas.readthedocs.io/en/latest/jpstrings.html


このエントリーをはてなブックマークに追加

ValueError: Plan shapes are not aligned

シンプルな改修のはずなのに、なんかエラーがでて止まった。
内容は、

ValueError: Plan shapes are not aligned

というもの。
どうもpandasあたりで悪さをして、concatでエラーになっているようだけど、
症状から調べるより変更作業から調べた方が早そうなんで調査。

原因は、pandasにデータを渡してる部分でpostgreSQLにデータ取得を投げてるんですが、
そこに加えたカラム追加が、すでに同じ名前のカラムがあったのでバッティングしていました。

pandasか、dfで取り扱う名前が同じだから困ってエラーになったみたい。


このエントリーをはてなブックマークに追加

pandasでデータフレームをいろいろな形でmerge

はい、なんかわかったようでわかりづらいpandas。
SQLでやることはすぐに思いつくのに、pandasの書き方で四苦八苦してます。

っていうことで、超簡単対応表。
これだけ分かればいいかな。

SQL = pandas
 full outer join = outer
 left outer join = left
 join = join

pandasの表記例

    df_report = df_1.merge(df_2, on=['key'], how='outer')\
        .merge(df_3, on=['key'], how='outer')\
        .merge(df_4, on=['key'], how='outer')\
        .fillna(0)

やってることはkeyで接続し、全部full outer join。
最後にfull outer join なのでデータが入らない空部分ができるので、そこにゼロを入れる。


参考:
https://deepage.net/features/pandas-merge.html 
このエントリーをはてなブックマークに追加

pythonで対象日付を動的に取るサンプル

はい、いまだにpythonに慣れないで四苦八苦(ほとんど触らないから)
ということで、メモ程度に記載。

要件
 毎月1日〜15日に実行=前月の16日〜月末
 毎月16日〜月末に実行=当月の1日〜15日
 引数指定したら、その対象日(from, to両方指定)

@click.command()
@click.option('--from-date', type=click.DateTime(['%Y%m%d']))
@click.option('--to-date', type=click.DateTime(['%Y%m%d']))
@stop_watch('main', logger)
def main(from_date, to_date):   
 if not from_date and not to_date:
        # 対象範囲無指定なので自動設定
        from_date, to_date = target_range(datetime.today().replace(hour=0, minute=0, second=0, microsecond=0))
    elif not from_date or not to_date:
        raise click.ClickException('from_date, to_date は指定するなら両方指定してください!')

def target_range(now):   
 """
    実行日を与えると集計対象日の組を返します
    """   
 if now.day < 16:  # 1日実行。(2〜15日に実行した場合も)
        from_date = now.replace(day=16) - relativedelta(months=1)
        to_date = now.replace(day=1) - timedelta(days=1)
    else:  # 16日実行(17日以降に実行した場合も)
        from_date = now.replace(day=1)
        to_date = now.replace(day=15)
    return from_date, to_date
入力する日付を、時分秒(マイクロ秒)を全てゼロにすることで丸めている。
このエントリーをはてなブックマークに追加

pythonでf文字列で出力を指定

急ぎ必要になったので調べました。
f文字列で日付型を渡すと、時分秒が入るけど、それを使わない場合の措置。

f'aaaaa{targetdata}bbbbb'
→aaaaa2020-04-16 00:00:00bbbbb

f'aaaaa{targetdata:%Y%m%d}bbbbb'
→aaaaa20200416bbbbb

コロンの後、書式を指定すれば行けるみたい。

参考:
https://qiita.com/lamplus/items/4db35b23d027e6cfeec6

このエントリーをはてなブックマークに追加

↑このページのトップヘ