質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1400閲覧

CSVファイルを二次元ファイルで読み込んだ後、データをソートしたい。<python.

moto_i

総合スコア20

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/03/18 13:23

CSVファイルを二次配列元で読み込んだ後、データをソートする方法を知りたいです。

次のようなCSVファイルを二次元配列で読みこみました。
その後、一番左の日時を日付情報として読み取らせて、ソートしたいです。
どのような処理を行えば下期待できる処理を行えますでしょうか。
教えて頂きたく思います。

|日時|開催場所|主催会社|対応部署
|:--|:--:|--:|
|2017/3/4|Tokyo|M銀行|総務部
2017/3/4|Tokyo|S銀行|総務部
2017/3/3|Tokyo|S信託|総務部
2017/3/5|Tokyo|N証券|総務部
2017/3/5|KObe|M銀行|総務部

....7000件以上このようなデータが続きます。

python

1import csv 2 3with open('data.csv') as fp: 4 lst = list(csv.reader(fp)) 5 6print(lst)

期待したい処理結果
[['2017/3/3', 'Tokyo', 'S信託', '総務部']
['2017/3/3', 'Tokyo', 'S信託', '総務部']
['2017/3/4', 'Tokyo', 'S銀行', '総務部']
['2017/3/5', 'Tokto', 'N証券', '総務部']
['2017/3/5', 'Kobe', 'M銀行', '総務部']
...

['2018/10/31', 'Tokyo', 'M証券', '総務部']]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

pandas を使うのが簡単かと思います。

python

1import pandas as pd 2 3df = pd.read_csv('test.csv', parse_dates=['日時'], encoding='shift-jis') 4df = df.sort_values('日時') 5df.to_csv('sorted_data.csv', index=False)

追記

csv モジュールを使うやり方

python

1import csv 2from datetime import datetime as dt 3 4data = [] 5with open('test.csv', encoding='shift-jis') as f: 6 reader = csv.reader(f) 7 header = next(reader) 8 data = list(reader) 9 10data = sorted(data, key=lambda x: dt.strptime(x[0], '%Y/%m/%d')) 11with open('sorted_data.csv', 'w') as f: 12 writer = csv.writer(f) 13 writer.writerow(header) 14 writer.writerows(data)

こちらで動作確認に使用した csv ファイル

入力
test.csv

csv

1日時,開催場所,主催会社,対応部署 22017/3/4,Tokyo,M銀行,総務部 32017/3/4,Tokyo,S銀行,総務部 42017/3/3,Tokyo,S信託,総務部 52017/3/5,Tokyo,N証券,総務部 62017/3/5,KObe,M銀行,総務部

出力
sorted_data.csv

csv

1日時,開催場所,主催会社,対応部署 22017/3/3,Tokyo,S信託,総務部 32017/3/4,Tokyo,M銀行,総務部 42017/3/4,Tokyo,S銀行,総務部 52017/3/5,Tokyo,N証券,総務部 62017/3/5,KObe,M銀行,総務部

投稿2019/03/18 13:50

編集2019/03/18 15:39
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moto_i

2019/03/18 14:00

回答ありがとうございます。 自分の環境で試しましたが、下記の文字コードエラーがでています。 UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
tiitoi

2019/03/18 14:08

csv の文字コードはなんでしょうか? df = pd.read_csv('data.csv', parse_dates=['日時']) ↓ shift-jis であれば、以下のようにエンコーディングを指定してください。 df= pd.read_csv('data.csv', parse_dates=['日時'], encoding='shift_jis') もしくは Excel 等で作成したファイルの場合 cp932 の可能性もありますので、上記で駄目なら以下も試してください df= pd.read_csv('data.csv', parse_dates=['日時'], encoding='cp932')
moto_i

2019/03/18 14:26

フォローありがあとうございます。 エンコーディング指定をencoding='shift_jis' , 'cp932'で試しましたが、それぞれエラーが出てしまいました。ちなみにCSVファイルはExcelで作成したあものです。
tiitoi

2019/03/18 14:35 編集

csv ファイルの文字コードがなにかわかりませんか? わからない場合は「文字コード 調べ方」等で検索してみてください。
moto_i

2019/03/18 14:58 編集

調べました。SJISになっています。 サクラエディタを使って、CSVファイルの文字コード判定を行いました。 エンコーディングをSJISに設定しましたが、プログラムが走りませんでした。
tiitoi

2019/03/18 15:14 編集

shiftjis であれば、encoding='shift-jis' で読み込めるはずなので、ちょっとわからないですね。 一応、csv モジュールを使うやり方も追記してみました。
moto_i

2019/03/18 15:28

ありがとうございます。ソート処理ができました。 要素数が1つ減っているみたいですね。 要素数を減らさずにソートすることは可能でしょうか? [['2017/3/3', 'Tokyo', 'S信託', '総務部'], ['2017/3/4', 'Tokyo', 'S銀行', '総務部'], ['2017/3/5', 'Tokto', 'N証券', '総務部'], ['2017/3/5', 'Kobe', 'M銀行', '総務部']]
tiitoi

2019/03/18 15:33 編集

> 要素数が1つ減っているみたいですね。 csv ファイルの1行目に「日時,開催場所,主催会社,対応部署」というヘッダーはあるものだと思っていたのですが、ないのでしょうか? もしそうなら、header = next(reader) と writer.writerow(header) の行は消してください。
tiitoi

2019/03/18 15:37

動作確認に使用した csv ファイルを追記しました。
moto_i

2019/03/18 15:45

ご丁寧に説明頂きありがとうございます。 すみません。ヘッダーはありましたが、消していました。こちらのミスです。 非常に勉強になりました。非常に感謝しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問