读入csv并转换所有时间

时间:2014-02-24 16:53:51

标签: python csv

我有一个像这样的csv:

Name, TIME, TIME, TIME, TIME, Something, TIME, TIME, TIME, Something....

我想要使用所有TIME列并使用

转换它们
datetime.datetime.fromtimestamp(TIME).strftime('%Y-%m-%d %H:%M:%S')

我正在尝试以下

def transform_date(TIME):
    return datetime.datetime.fromtimestamp(TIME).strftime('%Y-%m-%d %H:%M:%S')

def transform_row(row):
    return row[0] + [transform_date(row[1])]  + [transform_date(row[2])] + [transform_date(row[3])] + [transform_date(row[4])] + row[5] + [transform_date(row[6])]+ [transform_date(row[7])] + [transform_date(row[8])] + row[8:]

name = 'FakeAPData.csv'
bakname = name + '.bak'
os.rename(name, bakname)
with open(bakname, 'rb') as 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))

如何让transform_row变得更好?

1 个答案:

答案 0 :(得分:3)

您可以使用map

return ([row[0]] + map(transform_date, row[1:5]) + 
        [row[5]] + map(transform_date, row[6:]))

这将依次将函数应用于每个项目并返回结果列表(在Python 2.x中 - 在3.x中它是迭代器)。


或者,让transform_date处理无法处理输入的情况,并应用于整个row

def process_item(s):
    try:
        return datetime.datetime.fromtimestamp(s).strftime('%Y-%m-%d %H:%M:%S')
    except ValueError:
        return s

def transform_row(row):
    return map(process_item, row)