Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

DataFrameを月毎に分割してCSVで保存したい

作成したDataFrameを月毎のデータに分割してcsvで保存しようと考えているのですが、コードを実行するとエラーは表示されません。ですがファイルも作成されず過程を見るためにmonthly_dataのdataframeをprintしても何も表示されません。どこが間違っているのかご指摘いただけると有難いです。よろしくお願いいたします。

発生している問題・エラー

Process finished with exit code 0

該当するソースコード

# 作成したデータの読み込み
dfr=pd.read_csv('C:/data_information/Covid19_prediction/Covid19_data.csv')

# 日付データをdatetimeで変換
dfr['日付']=pd.to_datetime(dfr['日付'],format='%Y年%m月%d日')

# データを月ごとに分割する
df=dfr
df['year']=df['日付'].map(lambda x:x.year)
df['month']=df['日付'].map(lambda x:x.month)

# listの作成
sep_date=[]
sep_data=[]
sep_year=[]
sep_month=[]
last_date=[]
last_data=[]

df_datetime=df.日付.values
df_data=df.日別感染者数.values
df_year=df.year.values
df_month=df.month.values

# print(df_datetime)
# print(df_data)
# print(df_year)
# print(df_month)
# print(df.shape[0])

i=0
j=0

for idx in range(df.shape[0]):
    # ループごとに先に数値を用意した配列に格納
    sep_data.append(df_data[idx])
    sep_date.append(df_datetime[idx])
    sep_year.append(df_year[idx])
    sep_month.append(df_month[idx])
    # 差分を取るために最低でも月の要素は2つ必要。最初の格納時とを以降の処理を分ける
    # 要素が1つしかない場合は差分が取れない次のループに移る
    if len(sep_month)<=1:
        i+=1
        continue
    # 要素が2つ以上になったら現在とひとつ前の要素の値で差分を取る
    # 差分が0の場合は同じ月としてみなす
    #
    if len(sep_month)>1:
        if sep_month[i]-sep_month[i-1]==0:
            if idx+1 != df.shape[0]:
                i+=1
                continue
            else:
                pass
            if len(last_date)>0:
                sep_date.insert(0,last_date[j])
                sep_data.append(0,sep_data[j])
                j+=1
            # CSVタイトル用
            # 上のif文でiに1を足しているので-1する必要がある
            ym=str(sep_year[i-1])+'-'+str(sep_month[i-1])
            # 現在のループ回数+1の回数が最終行でなければ翌月のデータが配列に入ってくるためそれを取り除いたデータをデータフレーム化。
            # データフレーム化しないとファイル出力不可
            if idx+1 != df.shape[0]:
                monthly_data=pd.DataFrame({'日付':sep_date[:-1],
                                           '日別感染者数':sep_data[:-1]})

            # 現在のループ回数+1の回数が元データの最終行であれば
            # 月半ばで終わっている今回のデータでは翌月データが乗っかってこないため
            # 配列に入れた要素をすべてをデータフレーム化する。
            if idx+1 == df.shape[0]:
                monthly_data = pd.DataFrame({'日付': sep_date[:],
                                             '日別感染者数': sep_data[:]})

            # CSVファイルとして出力し、保存する
            monthly_data.to_csv('C:/data_information/Covid19_prediction/'+             ym +'.csv')

            last_date.append(sep_date[-1])
            last_data.append(sep_data[-1])

            # ファイル出力したら配列を空にして、翌月のループで使用できるようにする
            sep_date.clear()
            sep_data.clear()

            sep_year.clear()
            sep_month.clear()
            i=0


0

2Answer

if sep_month[i]-sep_month[i-1]==0とありますがここがずっとFalseなのでしょう。
ここが一度Falseになるとその後iは変わらないので。

0Like

Comments

  1. @shunpei535

    Questioner

    回答ありがとうございます。コードが長くなりすぎているのでご指摘いただいた部分を含めてもう一度考えてみます!

やりたいことに対してコードが大きすぎてエラーを追いかけるのは面倒くなったので、
とりあえず、DataFrameを月毎のデータに分割するこーどこんな感じでどうでしょうか?

import pandas as pd
df = pd.DataFrame({'日付':['2020年4月6日','2020年5月8日'], '日別感染者数':[1,2]})
df['key'] = pd.to_datetime(df['日付'],format='%Y年%m月%d日').dt.strftime('%Y%m')
df_dict = {name: group[['日付','日別感染者数']] for name, group in df.groupby('key')}
0Like

Comments

  1. @shunpei535

    Questioner

    教えていただいたコードがとても簡潔で分かりやすかったです!おかげでうまくいきました。ありがとうございます。

Your answer might help someone💌