我正在使用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
答案 0 :(得分:2)
每个row
只是list
。您可以就地修改它,或者创建一个包含您想要替换的值的新列表:
row[0] = y # or row = [y] + row[1:], or ...
如果要将其写回文件,则需要使用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))
答案 1 :(得分:1)
首先,有更好的方法将文本日期时间格式转换为UNIX时间戳。直接使用time
module可将您的代码简化为:
import time
import calendar
timestamp = calendar.gmtime(time.strptime(row[0], '%Y-%m-%d %H:%M:%S'))
但即使是您创建的datetime
对象也有.timetuple()
和.utctimetuple()
方法,这些方法在生成time_struct
元组时比解析{的字符串格式更可靠。 {1}}对象返回整数元组。您也可以在datetime
上直接直接,因为row[0]
的输出与您开始使用的格式相同。
接下来,写完一个新文件,并在完成后用它替换旧文件:
str(datetime.now())