2017-06-22 72 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 = " "來刪除它們。