質問: Pythonに触れて3日目の初心者です... 以下のような、一分ごとに記録されたcsv時系列データがあります。 1列目:日付(mm/dd/yy) 2列目:時間(hh:mm:ss) 3〜12列目(各データ) 12/27/18 08:32:14 960.65 0 33.1 0.1376 1.94 75.8 307.5 2.77 11.08 0.1368 12/27/18 08:33:14 960.55 0 35.6 0.1368 1.94 75.8 15.4 0.25 1.51 0.1376 12/27/18 08:34:14 960.65 0 36.9 0.1368 1.913 75.5 355.2 1.51 4.53 0.1376 ・ ・ ・ 01/21/19 08:55:14 958.95 0 -888.9 0.0214 0.301 57.3 308.9 2.52 6.3 0.0228 01/21/19 08:56:14 959.15 0 -888.9 0.0214 0.163 57.7 205 2.01 5.54 0.0228 01/21/19 08:57:14 959.15 0 -888.9 0.0214 0.163 57.7 282.2 2.01 4.78 0.0228 データの期間は12/27〜1/21なのですが、これを日ごとにデータを抽出してcsvに出力するプログラムを組みたいです。 例として、下の画像は月ごとですが、このような形で日ごとに出力されるのが理想です。 !1 pandasを使用しプログラムを組んでみたのですが、どうもうまく動きません。 稚拙な説明で申し訳ありませんが、お分かりになる方にご教授いただけると幸いです... よろしくお願いいたします。
回答: 次の条件を補完して、以下のようになるでしょう。 * 入力ファイル名は仮に 'data.csv' * 入力側/出力側の両方のデータにヘッダ行は無し * データの区切りはタブコード 異常なデータやエラーへの対処は省いています。 ``` import pandas as pd import datetime infilename = 'data.csv' df = pd.read_csv(infilename, header=None, sep='\t', names=list('ABCDEFGHIJKL')) date_list = list(df['A'].unique()) for date_str in date_list: outfilename = datetime.datetime.strptime(date_str, '%m/%d/%y').strftime('%Y-%m-%d') + '.csv' ds = df[df['A'].isin([date_str])] ds.to_csv(outfilename, header=False, index=False, sep='\t') ``` マルチポスト先の回答の方が簡潔ですね。ただ出力ファイル名は当方のが良さそうです。 パクッて組み合わせると以下になるでしょう。 ``` import pandas as pd import datetime infilename = 'data.csv' df = pd.read_csv(infilename, header=None, sep='\t') for date_str, daily_data in df.groupby(0): outfilename = datetime.datetime.strptime(date_str, '%m/%d/%y').strftime('%Y-%m-%d') + '.csv' daily_data.to_csv(outfilename, header=False, index=False, sep='\t') ``` 他にこの辺の記事が、csv の読み書き時の使い方を詳しく解説しているでしょう。 詳説Pandasのread_csvとread_table関数の使い方 Pandasのto_csv関数を使ってCSVファイルに書き出す方法 同サイトで groupby の使い方記事です。 Pandasのgroupbyを使った要素をグループ化して処理をする方法