从另一个创建CSV文件

时间:2017-06-22 08:36:53

标签: python database 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')

但是这段代码没有给我预期的结果。 有什么建议吗?

2 个答案:

答案 0 :(得分:2)

好的,我将在这个中解释很多。

如果您打算处理日期,我强烈建议您使用datetime个对象。因为这正是他们最初的原因所在。将它们转换为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 datetime timedelta添加[item[0]+timedelta(minutes=10*(i)) for i,x in enumerate(item)] 添加enumerate一样。{/ 1}}

list,string,tuple..etc

你可能会认为嘿这到底是什么?。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之后你得到了这个:

writer

多么美丽?

现在再次将quotechar = " "个对象转换为字符串

View

所以Text将其转换为所需的格式!并且唉使用csv <View style={styles.container}> <Button title="Login" color="red" onPress={() => this.props.navigation.navigate("Login")} /> </View> 将它们写入新的csv文件中。

注意:默认情况下会打印日期和引号!您在输出中不想要的,因此请使用{{1}}删除它们。

答案 1 :(得分:-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