重新组织CSV以使日期不是列标题

时间:2014-08-29 18:46:34

标签: python excel csv

我正在尝试重组excel表(或csv),以便日期不再是列标题。我使用有限的python知识来尝试这样做,但由于不知道从哪里开始,我可以使用一些帮助。

在每个日期下记录当天发生的特定地点的情况。可以跳过空值。有些单元格包含" - "并且可以转换为0.我想为日期和列创建一列来表示当天的数字读数。如果当天监控地名,则地名是新行。

示例(以这种方式启动的人的smh):

Name,7/1/2009,7/2/2009,7/3/2009,7/4/2009..... (and so on to the present)
Place A,,5,3,
Place B,0,,23,--
Place C,1,2,,35

我想要的是:

Name, Date, Reading
Place A, 7/2/2009, 5
Place A, 7/3/2009, 3
Place B, 7/1/2009, 0
Place B, 7/4/2009, 0   <--- Even though this is a dash originally it can be converted to a 0 to keep the number an int.  

有数百个行(地点)和列(日期)已经达到BPD(这是1772列!)。

3 个答案:

答案 0 :(得分:2)

您要做的是将表格标准化为表格。

一般来说,这样做的方法是:对于非正规表中的每一行,将行插入到每个非正规列的普通表中。

您执行此操作的方式尤其取决于您处理表格的方式。例如,如果你在Python 3.x中使用csv模块,使用Excel默认方言的CSV文件,它将是这样的:

with open('old.csv') as oldcsv, open('new.csv', 'w') as newcsv:
    r, w = csv.reader(oldcsv), csv.writer(newcsv)
    header = next(r)
    w.writerow(['Name', 'Date', 'Reading'])
    for row in r:
        for colname, colval in zip(header[1:], row[1:]):
            w.writerow([row[0], colname, colval])

如果您想使用,例如xlrd / xlwtXlsxReader / XlsxWriterwin32com Excel脚本等,详细信息将会是不同的,但基本思路是相同的:迭代行,然后遍历日期列,根据行中的名称,列标题中的日期和来自列的值生成每行的新行这一行。

你应该能够弄清楚如何跳过空值,将"--"转换为0等等。

答案 1 :(得分:0)

即使您刚开始使用python

,下面的代码也是不言自明的

enumerate是索引的迭代器,可迭代的值

>>> content = """Name,7/1/2009,7/2/2009,7/3/2009,7/4/2009
... Place A,,5,3,
... Place B,0,,23,--
... Place C,1,2,,35"""
>>> 
>>> lines = [line.split(',') for line in content.split('\n')]
>>> 
>>> for line in lines:
...   if 'Name' not in line[0]:
...     for count, date in enumerate(lines[0]):
...       if count >= 1:
...         if not line[count] or line[count] == '--':
...           line[count] = 0
...         # write (line[0], date, line[count]) to a file or print it:
...         print (line[0], date, line[count])
... 
('Place A', '7/1/2009', 0)
('Place A', '7/2/2009', '5')
('Place A', '7/3/2009', '3')
('Place A', '7/4/2009', 0)
('Place B', '7/1/2009', '0')
('Place B', '7/2/2009', 0)
('Place B', '7/3/2009', '23')
('Place B', '7/4/2009', 0)
('Place C', '7/1/2009', '1')
('Place C', '7/2/2009', '2')
('Place C', '7/3/2009', 0)
('Place C', '7/4/2009', '35')

答案 2 :(得分:0)

以下代码将表格化为您所描述格式的表格csv,并输出一个新的csv文件,其中每个(地点,日期)对都有行记录。它还将更改列为“&#39; - &#39;到0。

oldlist = []
newlist = ['Name,Date,Reading'] 

with open('path_to_csv.csv') as oldcsv, open('newcsv.csv', 'w') as newcsv:
    for line in oldcsv:
        line = line.strip('\n')
        oldlist.append(line.split(','))

    for (i,row) in enumerate(oldlist[1:]):
        for (j, column) in enumerate(row[1:]):
            if column != '':
                newrow = []
                newrow.append(row[0]) #Adds place name to each newlist row.
                newrow.append(oldlist[0][j+1]) #Adds date to each newlist row.
                if column == '--':
                    newrow.append('0')
                else:
                    newrow.append(column) #Adds reading to each newlist row.
                newlist.append(",".join(newrow))

    for line in newlist:    
        newcsv.write("%s\n" % line)