我获取原始数据然后重新排序列,根据来自多个文件的数据添加数据,添加一些硬编码数据,然后保存到" output.csv"文件。
例如......
File1.csv :(检索数据)
人,日期时间,网站,状态
Person1,01/13/16 10:38,SiteA,I
Person1,01/20/16 12:53,SiteC,O
Person2,01/21/16 14:45,SiteB,O
Person3,01/17/16 12:17,SiteA,I
Person3,01/25/16 10:15,SiteB,L
File2.csv :(固定Data_1)
站点,代码
SiteA,101
SiteB,102
SiteC,103
File3.csv :(固定数据_2)
period_start_time,period_end_time,周期
00:00,07:59,0
08:00,09:00,1
09:01,10:00,2
10:01,11:00,3
11:01,12:00,4
12:01,13:00,5
13:01,14:00,6
14:01,15:00,7
15:01,23:59,X
File1有原始数据
最后一栏有一个" I"," O"和" L"。
"我"代表IN。
" O"代表OUT。
" L"代表晚。
此示例有三名学生进出A,B或C站点 注意,如果他们是" L"或者他们还在继续。
File2有"网站代码"。
File3的第一列说明了period_start_time,第二列是period_end_time。
第三列是期间。
我需要创建一个output.csv文件:
WHERE,其中,PERIOD,DATE TIME_IN,TIME_OUT,USERNAME
WHERE =需要是来自File2的相应站点代码
WHOM =是这个人
PERIOD =如果时间是10:38,那么时间是" 3",由File3给出。
DATE =显示时间为' mm / dd / yy'
TIME_IN =显示时间为' HH:MM'如果状态是"我"或者" L",如果没有,则留空。
TIME_OUT =显示时间为' HH:MM'如果状态为" O",如果没有,则留空。
USERNAME =是硬编码的"用户名"。
如上面的示例数据,output.csv文件应该如下所示
output.csv :(重新格式化数据)
101,Person1,3,01/13/16,10:38,,Username
103,Person1,5,01/20/16,,12:53,Username
102,Person2,7,01/21/16,,14:45,Username
101,Person3,5,01/17/16,12:17,,Username
102,Person3,3,01/25/16,10:15,,Username
请注意第一栏中的相应代码
另请注意PERIOD以及TIME_IN和TIME_OUT列的空白。
终于明白了。
from datetime import datetime as dt
import csv
class TimePeriod:
def __init__(self, starttime, endtime, periodname):
self.starttime = starttime
self.endtime = endtime
self.periodname = periodname
def get_time_list(time_file):
timelist = list()
with open(time_file) as inputs:
for line in inputs:
starttime, endtime, periodname = line.strip().split(",")
timelist.append(TimePeriod(starttime, endtime, periodname))
return timelist
def get_site_code_dict(site_code_file):
mydict = dict()
with open(site_code_file) as inputs:
for line in inputs:
site,code = line.strip().split(",")
mydict[site] = code
return mydict
def process_raw(raw_file, site_code_dict):
with open(raw_file) as inputs, open('ouput.csv', 'w') as outlist:
for line in inputs:
person, date_time, site, status = line.strip().split(",")
time_object = dt.strptime(date_time, '%m/%d/%y %H:%M')
date = time_object.strftime('%m/%d/%y')
time = time_object.strftime('%H:%M')
filteredlist = filter(lambda x: time >= x.starttime and time <= x.endtime, time_list)
outlist.write(site_code_dict[site]+',')
outlist.write(person+',')
outlist.write(date+',')
outlist.write(filteredlist[0].periodname+',')
if status == "I" or status == "L":
outlist.write(time+',')
else:
outlist.write(""+',')
if status == "O":
outlist.write(time+',')
else:
outlist.write(""+',')
outlist.write("Username"+'\n')
outlist.close()
if __name__ == "__main__":
site_code_dict = get_site_code_dict("file2.csv")
time_list = get_time_list("file3.csv")
process_raw("file1.csv", site_code_dict)
从csv文件输出数据:
101,Person1,01/13/16,3,10:38,,Username
103,Person1,01/20/16,5,,12:53,Username
102,Person2,01/21/16,7,,14:45,Username
101,Person3,01/17/16,5,12:17,,Username
102,Person3,01/25/16,3,10:15,,Username
通过上面的代码,我按顺序排列了这些列
第1列具有正确的代码
DATE列的日期恰好为&#39; mm / dd / yy&#39;格式。
TIME_IN列只有军事时间,如果记录是&#34;我&#34;或者&#34; L&#34;。
TIME_OUT列有军事时间,如果是&#34; O&#34;。
通过使用&#34;类&#34;我完成了这段时间。 TIMEPERIOD。
感谢您的帮助,因为我非常喜欢。
答案 0 :(得分:0)
def get_site_code_dict(site_code_file):
mydict = dict()
with open(site_code_file) as inputs:
for line in inputs:
site,code = line.strip().split(",")
mydict[site] = code
return mydict
def process_raw(raw_file, site_code_dict):
with open(raw_file) as inputs:
for line in inputs:
person, date_time, site, status = line.strip().split(",")
outlist = list()
outlist.append(site_code_dict[site])
outlist.append(person)
outlist.append(date_time)
outlist.append(status)
print ",".join(outlist)
if __name__ == "__main__":
site_code_dict = get_site_code_dict("file2")
process_raw("file1", site_code_dict)
输出:
101,Person1,01/13/16 10:38,I
103,Person1,01/20/16 12:53,O
102,Person2,01/21/16 14:45,O
您可以将键值对创建为get_site_code_dict
以绑定站点名称和代码编号,然后使用它来处理原始数据。