2

我正在使用 Python csv 模块来读取一个 csv 文件,其中每一行都像:

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

然后我将 row[0] 转换为 unix 时间,但是我想用我刚刚为 csv 文件的每一行找到的 unix 时间替换 datetime

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_struct元组时也比将datetime对象的字符串格式解析回整数元组更可靠。您也可以直接这样做,row[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 ...

如果要将其写回文件,则需要使用 a csv.writer。例如:

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 回答