我有一个 csv 文件,如下所示:
19/04/2015 00:00 180 187 85 162 608 61
19/04/2015 01:00 202 20 26 70 171 61
19/04/2015 02:00 20 40 40 11 40 810
19/04/2015 03:00 20 80 81 24 0 86
19/04/2015 04:00 25 30 70 91 07 50
19/04/2015 05:00 80 611 691 70 790 37
19/04/2015 06:00 199 69 706 70 790 171
19/04/2015 07:00 80 81 90 192 57 254
19/04/2015 08:00 40 152 454 259 52 151
每一行都在文件中的同一个单元格中。
我试着让它看起来像这样:
19/04/2015 00:00 180
19/04/2015 00:10 187
19/04/2015 00:20 85
19/04/2015 00:30 162
19/04/2015 00:40 608
19/04/2015 00:50 61
19/04/2015 01:00 202
等..
解释:
第一个数字列表是日期 dd/M/YYYY HH:mm
,有 6 个值,每个值每 10 分钟。
在第二个演示文稿中,我想要每个值的日期以及准确的时间和分钟数。
到目前为止,这是我尝试过的:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys, getopt
import tarfile
import re
import pandas as pd
import tempfile
import shutil
import collections
import urllib
import numpy
import logging
import csv
csvFile = "testfile.csv"
data = []
minutes = ['00:00','10:00','20:00','30:00','40:00','50:00']
with open(csvFile, 'rb') as csvfile:
reader = csv.reader(csvfile, delimiter=',')
for row in reader:
row[0] = re.sub("\s+", ";", row[0].strip())
rowlist = row[0].split(';')
while(len(rowlist)<8):
rowlist.append(0)
for i in range(len(rowlist)):
for m in minutes:
data.append(rowlist[0]+rowlist[1]+m)
data.append(rowlist[i])
df = pd.DataFrame(data)
df.to_csv('example.csv')
但是这段代码并没有给我想要的结果。 有什么建议吗?
最佳答案
好的,我将在这一节中解释很多内容。
如果您要处理日期,我强烈建议您使用datetime
对象。因为这正是他们排在首位的原因。将它们转换为日期时间对象,您可以进行大量操作。
这是适合您的完整工作代码。我将深入解释所有概念!
输入:
19/04/2015 00:00, 180 , 187 , 85 , 162 , 608 , 61
19/04/2015 01:00, 202 , 20 , 26 , 70 , 171 , 61
19/04/2015 02:00, 20 , 40 , 40 , 11 , 40 , 810
代码:
import csv
from datetime import datetime,timedelta
list_of_list = []
with open("old_file.csv","r+") as my_csv:
for line in my_csv:
line = line.strip().replace(" ",'').split(',')
list_of_list.append(line)
for item in list_of_list:
dt = datetime.strptime(item[0],'%d/%m/%Y%H:%M')
item[0]=dt
fin_list = []
for item in list_of_list:
temp_list = [item[0]+timedelta(minutes=10*(i)) for i,x in enumerate(item)]
my_list = [list(a) for a in zip(temp_list,item[1:])]
fin_list.extend(my_list)
for item in fin_list:
item[0] = datetime.strftime(item[0],"%d/%m/%Y %H:%M")
item[0].replace('"','')
print(fin_list)
with open("new_file.csv","w+") as my_csv:
csvWriter = csv.writer(my_csv,delimiter=' ',quotechar = " ")
csvWriter.writerows(fin_list)
输出:
19/04/2015 00:00 180
19/04/2015 00:10 187
19/04/2015 00:20 85
19/04/2015 00:30 162
19/04/2015 00:40 608
19/04/2015 00:50 61
19/04/2015 01:00 202
19/04/2015 01:10 20
19/04/2015 01:20 26
19/04/2015 01:30 70
19/04/2015 01:40 171
19/04/2015 01:50 61
19/04/2015 02:00 20
19/04/2015 02:10 40
19/04/2015 02:20 40
19/04/2015 02:30 11
19/04/2015 02:40 40
19/04/2015 02:50 810
1) 请注意,我正在获取每一行并将它们放入列表中。同时替换和去除所有的 whitespaces
,\n
,\r
line = line.strip().replace(" ",'').split(',')
list_of_list.append(line)
之后的输出:
['19/04/201500:00', '180', '187', '85', '162', '608']
2) dt = datetime.strptime(item[0],'%d/%m/%Y%H:%M')
这是什么? datetime 中的 strptime
接受一个字符串并将其转换为您可以轻松操作的 datetime 对象。
例子:
>>> datetime.strptime('19/04/201500:00','%d/%m/%Y%H:%M')
>>> datetime.datetime(2015, 4, 19, 0, 0)
>>> datetime.strptime('19/04/2015 00:00','%d/%m/%Y %H:%M') #notice how this is different from above!
>>> datetime.datetime(2015, 4, 19, 0, 0)
>>> datetime.strptime('Apr 19 2015 12:00','%b %d %Y %H:%M')
>>> datetime.datetime(2015, 4, 19, 12, 0)
你能看出它是如何转变的吗?一旦将其更改为 datetime
对象,您就可以轻松地添加分钟、天、小时、月等任何您想要的内容!
但是要添加它们,您需要一个 timedelta
对象。像这样对 integer
添加 integer
的方式与 datetime
添加 timedelta
的方式相同。
[item[0]+timedelta(minutes=10*(i)) for i,x in enumerate(item)]
你可能会想,嘿,这到底是什么?enumerate
一个可迭代对象(list,string,tuple..etc
)给出了两个东西 i,element。我会在哪里 0,1,2,3,....直到 iterable 的最后一个索引(这里是列表)
。所以第一个 i,x
将是 0,item[0]
接下来 i,x
将是 1,item[1]
等等。
因此列表推导只是将 0,10,20 ,30,40,..
分钟添加到每个 datetime 对象。
每一项如下,
[datetime.datetime(2015, 4, 19, 0, 0), '180']
最后在 extend
之后你会得到这个:
[[datetime.datetime(2015, 4, 19, 0, 0), '180'],
[datetime.datetime(2015, 4, 19, 0, 10), '187'],
[datetime.datetime(2015, 4, 19, 0, 20), '85'],
[datetime.datetime(2015, 4, 19, 0, 30), '162'],
[datetime.datetime(2015, 4, 19, 0, 40), '608'],
[datetime.datetime(2015, 4, 19, 0, 50), '61']]
有多美?
现在再次将 datetime
对象转换为字符串,
item[0] = datetime.strftime(item[0],"%d/%m/%Y %H:%M")
因此 strftime
将其转换为所需的格式!。唉,使用 csv writer
将它们写入新的 csv 文件。
注意:这将默认打印日期和引号!。您不希望出现在输出中,因此请使用 quotechar = ""
删除它们。
关于python - 从另一个创建 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44694286/