2

Python csv モジュールを使用して、すべての行が次のような csv ファイルを読み取ります。

2013-04-16 7:11:01,186744,3,2,2,1.89E-03

次に、行[0]をUNIX時間に変換しますが、csvファイルのすべての行で見つけたばかりのUNIX時間で日時を置き換えたい

import pymongo
import datetime
import re
import csv
import calendar

X = []
OBD = []
Y = []

csv_in = open('FakeAPData.csv', 'rb')


for row in reader:
    date = datetime.datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S')
    datet = unicode(datetime.datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S'))
    datett = tuple(int(v) for v in re.findall("[0-9]+", datet))
    y = calendar.timegm(datett)
    Y.append(y)

したがって、unixtime 値を使用してリスト Y を作成しますが、次のような出力を得るために置換を行うにはどうすればよいですか。

1366097085,186744,3,2,2,1.89E-03
4

2 に答える 2

3

まず第一に、テキストの日付/時刻形式を UNIX タイムスタンプに変換するより良い方法があります。timeモジュールを直接使用すると、コードが次のように簡素化されます。

import time
import calendar

timestamp = calendar.gmtime(time.strptime(row[0], '%Y-%m-%d %H:%M:%S'))

ただし、作成したオブジェクトでさえ、datetimeオブジェクトの文字列形式を解析して整数のタプルに戻すよりも、タプルを生成する方がはるかに信頼できるメソッドが.timetuple()あります。の出力は最初の形式と同じ形式であるため、直接実行することもできます。.utctimetuple()time_structdatetimerow[0]str(datetime.now())

次に、新しいファイルを書き出して、古いファイルを一度置き換えます。

import csv
import time
import calendar
import os

with open('FakeAPData.csv', 'rb') as infile, open('FakeAPData.csv.new', 'wb') as outfile:
    writer = csv.writer(outfile)
    for row in csv.reader(infile):
        timestamp = calendar.gmtime(time.strptime(row[0], '%Y-%m-%d %H:%M:%S'))
        writer.writerow([timestamp] + row[1:])

os.rename('FakeAPData.csv.new', 'FakeAPData.csv')
于 2013-05-24T19:01:00.077 に答える
2

それぞれrowは単なるlist. その場で変更するか、置換したい値で新しいリストを作成できます。

row[0] = y # or row = [y] + row[1:], or ...

ファイルに書き戻したい場合は、csv.writerそのために a を使用する必要があります。例えば:

os.rename('FakeAPData.csv', 'FakeAPData.csv.bak')

csv_in = open('FakeAPData.csv.bak', 'rb')
csv_out = open('FakeAPData.csv', 'wb')

writer = csv.writer(csv_out)

for row in csv.reader(csv_in):
    date = datetime.datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S')
    datet = unicode(datetime.datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S'))
    datett = tuple(int(v) for v in re.findall("[0-9]+", datet))
    y = calendar.timegm(datett)
    row[0] = y
    writer.writerow(row)

もちろんclose、ファイルを削除して、繰り返し使用されていないコードをすべてクリーンアップすることも必要です。途中で、日付変換コードを関数に分解します。また、困難で壊れやすいものではなく、簡単にする関数を使用してください。

そう:

def transform_date(date):
    return calendar.gmtime(datetime.strptime(date, '%Y-%m-%d %H:%M:%S').timetuple())

def transform_row(row):
    return [transform_date(row[0])] + row[1:]

name = 'FakeAPData.csv'
bakname = name + '.bak'
os.rename(name, bakname)
with open(bakname, 'rb') as in csv_in, open(name, 'wb') as csv_out:
    writer = csv.writer(csv_out)
    writer.writerows(transform_row(row) for row in csv.reader(csv_in))
于 2013-05-24T18:57:01.580 に答える