1

大きなCSVファイルを小さなチャンクファイルにチャンクするスクリプトを作成中です。チャンクされた最後のタイムスタンプを保持するログファイルを相互参照して、ログに記録された時刻より後のタイムスタンプのみが書き込まれる/チャンクされるようにします。

csvファイルの最初の列には、%Y%m%d %H%M%S形式のタイムスタンプがあります。CSVファイルには、スクリプトで不要/不要な4行のヘッダー情報も含まれていますが、このrows in ts_pre句から削除されます。

このlog_lookup()関数は、私が表示している特定のステーションのCSVファイルのログから最後の時系列を取得するだけです。明らかに、2番目の段落で説明したのと同じ構造を共有していることを除いて、すべて異なる列の情報を持つ6つの異なるステーションで作業しています。

部分的なスクリプトは次のとおりです。

import csv, sys, datetime

def log_lookup():  
    global STN_num
    global STN_date
    with open('/home/log.txt', 'rb') as open_log:    
        log_file = csv.reader(open_log)
            for row in log_file:
                for item in row:
                     STN_date.append(item)
            if find == 'STN_1':
                return STN_date[1]
            if find == 'STN_2':           
                return STN_date[2]
            if find == 'STN_3':
                return STN_date[3]
            if find == 'STN_4':
                return STN_date[4]
            if find == 'STN_5':
                return STN_date[5]
            if find == 'STN_6':
                return STN_date[6]

def get_ts(line):
    print line[0:19]
    return datetime.datetime.strptime(line, "%Y/%m/%d %H:%M:%S")

def main():
    log = str(log_lookup()) #useful for knowing when to start chunking 
    log_datetime = datetime.datetime.strptime(log, "%Y/%m/%d %H:%M:%S")       

    with open(sys.argv[1], 'rb') as open_file: 
        ts_from_file = csv.reader(open_file)
        for genrows in ts_from_file:            
            ts_pre.append(genrows)  
            for rows in ts_pre:             
                if rownum < 4:
                    ts_pre.pop()
                    rownum += 1
                else:       
                    for line in rows:                            
                        if get_ts(line) > log_datetime:                 
                            timeseries.append(line)

ログファイルは単純です。

0
2011/10/06 18:40:00
2012/06/27 13:25:00
1900/01/01 00:00:00
2011/08/03 14:55:00
2012/06/27 20:05:00
2011/10/03 19:25:00

...プレースホルダーとして0を使用します。(私がプログラマーではないことは明らかですか?)

CSVファイルの例は次のようになります。

"2011/10/03 16:40:00",0,0
"2011/10/03 16:45:00",1,0
"2011/10/03 16:50:00",2,0
"2011/10/03 16:55:00",3,0

ts_line(line)関数が言っているときに私が得ているエラーは次のline[0:19]とおりです:

2011/10/03 16:40:00
0

関数が戻り0、Pythonは次のエラーをスローします。

ValueError: time data '0' does not match format '%Y/%m/%d %H:%M:%S'

返されるものがCSVファイルの2番目の項目であることを確認しました0が、Pythonがスライス選択でそれを返す理由について混乱しています。誰かがその値を返す理由と、タイムスタンプを取得してログのタイムスタンプと比較するために何をする必要があるのか​​を説明できますか?

追加のクレジットとして、コーディング/スタイルに関するアドバイスや、より良い方法に関するアドバイスは、私がやっていることを達成するために常に高く評価されています。私が見ているCSVファイルは非常に大きい(〜8 MB)ので、効率が高いほど良いです。

4

1 に答える 1

0

get_tscsv のすべての行の各列を 呼び出しているようです。

それ以外の

for line in rows:                            
    if get_ts(line) > log_datetime:                 
        timeseries.append(line)

試す:

if get_ts(line[0]) > log_datetime:                 
    timeseries.append(line)
于 2012-08-16T00:01:51.483 に答える