PythonのいくつかのCSVファイルですべての行で数学操作を行う必要があります
質問
私は月に1回操作する必要がある約100個のCSVファイルを持っていますが、これに頭を包み込もうとしていましたが、壁に走っています。私はPythonについていくつかのことを理解し始めていますが、いくつかのことを組み合わせることは私に問題を与えているので、これを理解することはできません。
これが私の問題です:
私は多くのCSVファイルを持っています、そしてこれが私がしたことが必要なことです:
各行の前面に「列」を追加します(または背面、実際には関係ありませんが、前面は理想的です)。さらに、各行には5行があります(追加されるファイル名はカウントされません)、次の形式は次のとおりです。
6桁のID番号、yyyy-mm-dd(1)、yyyy-mm-dd(2)、yyyy-mm-dd(3)、1-2桁の数字
特定のディレクトリ内のすべてのCSVについて、ファイル内のすべての行(ヘッダー行はありません)について、Yyyy-Mm-DD(2)からyyyy-mm-dd(3)を差し引く必要があります。
ファイルを組み合わせるため(スクリプトに含まれている場合は素晴らしいですが、その部分を把握できると思います)、レコードがどのようなファイルから来たのかを知る必要があるため、行内のファイル名が必要です。ファイル名の形式は常に「4-5桁のnumber.csv」です
これが理にかなっていることを願っています。そうでなければ、私に知らせてください。私はどこから始めるべきかについて困惑しているので、本当に私のために働き始めたサンプルコードはありません。本当にイライラしているので、皆さんが提供できる助けに感謝します、このサイトは揺れます!
マイラン
解決
これらのタスクのそれぞれに標準ライブラリにツールがあります。
ディレクトリ内のすべてのCSVファイルを反復するには、 glob
モジュール:
import glob
for csvfilename in glob.glob(r"C:\mydirectory\*.csv"):
#do_something
CSVファイルを解析するには、を使用します csv
モジュール:
import csv
with open(csvfilename, "rb") as csvfile:
reader = csv.reader(csvfile, delimiter=",")
for row in reader:
# row is a list of all the entries in the current row
日付を解析して違いを計算するには、 datetime
モジュール:
from datetime import datetime
startdate = datetime.strptime("1999-10-20", "%Y-%m-%d")
enddate = datetime.strptime("2003-02-28", "%Y-%m-%d")
delta = enddate - startdate # difference in days
行の先頭に値を追加するには:
row[0:0] = [str(delta)]
ファイル名を行の最後に追加するには:
row.append(csvfilename)
新しいCSVファイルに行を書き込むには:
with open(csvfilename, "wb") as csvfile:
writer = csv.writer(csvfile, delimiter=",")
writer.writerow(row)
すべて一緒になって、あなたは取得します:
import glob
import csv
from datetime import datetime
with open("combined_files_csv", "wb") as outfile:
writer = csv.writer(outfile, delimiter=",")
for csvfilename in glob.glob(r"C:\mydirectory\*.csv"):
with open(csvfilename, "rb") as infile:
reader = csv.reader(infile, delimiter=",")
for row in reader:
startdate = datetime.strptime(row[3], "%Y-%m-%d")
enddate = datetime.strptime(row[2], "%Y-%m-%d")
delta = enddate - startdate # difference in days
row[0:0] = [str(delta)]
row.append(csvfilename)
writer.writerow(row)
他のヒント
プログラムの基本的な概要は次のようになります。
- OSモジュールを使用して、ファイル名をディレクトリ/関心のあるディレクトリから削除します
- 各ファイルを一度に1つずつ読み取ります
- ファイル内の各行について、それを列に分割します
columns = line.split(",")
- datetime.dateを使用して、「2011-05-03」などの文字列をDateTime.datesに変換します。
- 2番目から3番目の日付を減算し、DateTime.timedeltaを生成します。
- 必要な形式にすべての情報を置く(ヒント:str(foo)fooの文字列表現がほぼすべてのタイプの場合、それを後で覚えておいてください
- ファイルを閉じて、書き込みのために再開し、新しいものを書く