python - 从另一个创建 CSV 文件

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

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

最佳答案

好的,我将在这一节中解释很多内容。

如果您要处理日期,我强烈建议您使用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/

相关文章:

java - 在 Java 中使用 Buffered writer 编写一个 csv 文件

python - 在 Python 中组合两个单独的 WebScraped 列表

python - 如何在 Django 中连接两个表并在我的模板中使用结果?

php - 使用 LIKE 时如何按大多数匹配项对 MySQL 结果进行排序

mysql - 使用 concat 插入 MySQL 查询

c# - 制表符分隔文本复制粘贴到 Excel

Python 类型错误 : UMat() missing required argument 'ranges' (pos 2)

python - 通过传递列表作为键参数,使用sorted() 对列表进行排序

python - Python 中的 opencv groupRectangle 示例

mysql - 将一行中的选定列转换为多行