PythonのいくつかのCSVファイルですべての行で数学操作を行う必要があります

StackOverflow https://stackoverflow.com/questions/7350851

  •  28-10-2019
  •  | 
  •  

質問

私は月に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)

他のヒント

プログラムの基本的な概要は次のようになります。

  1. OSモジュールを使用して、ファイル名をディレクトリ/関心のあるディレクトリから削除します
  2. 各ファイルを一度に1つずつ読み取ります
  3. ファイル内の各行について、それを列に分割します columns = line.split(",")
  4. datetime.dateを使用して、「2011-05-03」などの文字列をDateTime.datesに変換します。
  5. 2番目から3番目の日付を減算し、DateTime.timedeltaを生成します。
  6. 必要な形式にすべての情報を置く(ヒント:str(foo)fooの文字列表現がほぼすべてのタイプの場合、それを後で覚えておいてください
  7. ファイルを閉じて、書き込みのために再開し、新しいものを書く
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top