我正在尝试重组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列!)。
答案 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
/ xlwt
,XlsxReader
/ XlsxWriter
,win32com
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)