2017-06-22 73 views
2

我有一个csv文件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') 

但这代码没有给我想要的结果。 有什么建议吗?

回答

-1

这应该工作:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

in_name = 'test.csv' 
out_name = 'sample.csv' 

with open(in_name, 'rb') as infile, open(out_name, 'wb') as out_file: 
    for line in infile: 
     parts = line.split() 
     date, time, data = parts[0], parts[1], parts[2:] 
     hours, _ = time.split(':') 

     for minutes, value in zip(range(0, 60, 10), data): 
      out_file.write('{date} {hours}:{minutes:02d} {value:>5}\n'.format(
       date=date, hours=hours, minutes=minutes, value=value 
      )) 

也有很多未使用的进口这是不必要的,可能reduce performance

+0

这就是它。但我想删除第一列和第一行。怎么做? – Somar

+0

这是一个好的开始。 OP说每10分钟的价值。我不知道如何使用'分钟[索引]'是准确的。 –

+0

我刚做了一个编辑。即使是“熊猫”进口也没有必要。 –

2

好吧我将在这一个解释很多。

强烈建议如果您打算处理日期,您可以使用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.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相同的方式datetimetimedelta

[item[0]+timedelta(minutes=10*(i)) for i,x in enumerate(item)] 

你可能会想,嘿,这到底是什么?一个迭代器(list,string,tuple..etc)的enumerate给出了两个元素i,element。我会在哪里0,1,2,3,....till last index of iterable (here list)。所以首先i,x将是0,item[0]接下来i,x将是1,item[1]等等。

因此,列表理解只是将0,10,20 ,30,40,..分钟添加到每个日期时间对象。

每个项目将低于,

[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 = " "来删除它们。