具体实现功能:1.读取csv文件;2. 将文件中的数据按照CommitTime排序;3. 将排好序的数据每两个月作为训练数据,隔两个月作为测试数据,生成若干个文件,分别命名为:data_i_fit.csv,data_i_est.csv.比如第1、2月作为训练数据,5、6月作为测试数据。
目录
一、导入模块
二、 读取文件&排序
三、 获取初始、终止时间
四、函数 增加时间
五、保存
六、完整代码
七、参考资料
import pandas as pd import datetime from dateutil.relativedelta import relativedelta import os.path
path为csv文件的路径,如使用,请更改路径。
使用pandas模块读取文件,因为文件可能会自动生成新的列,我就在打开csv的时候加了一句index_col=0。
按照“commitdate”列的值进行排序,并将排序好的文件存储下来。
path=r"C:\Users\86189\Desktop\jdt.csv" o=open(path) info=pd.read_csv(o,index_col=0) info.sort_values(by="commitdate") info.to_csv(r"C:\Users\86189\Desktop\jdt.csv") #jdt文件已经排序
o=open(path) info=pd.read_csv(o,index_col=0) starttime=info.iloc[0,0]+':00' endtime=info.iloc[-1,0]+':00' #获得第一次和最后一次的记录时间
重新读取刚刚写入的文件, 用iloc函数获取起始时间和终止时间,因为后续会使用到。
def addtime(x,y): a=list(x) if a[6]=='/': a.insert(5,'0') if a[-2]=='/': a.insert(-1,'0') d=''.join(a) d=datetime.datetime.strptime(x,'%Y/%m/%d %H:%M:%S')+relativedelta(months=y) d=str(d) d=d.replace('-','/') a=list(d) if a[5]=='0': del a[5] if a[-2]=='0': del a[-2] d=''.join(a) return d #函数将时间字符串x分别增加y月并以合适的字符串形式返回
这里是做了个时间加减几个月的函数,用了datatime模块。
因为中间datetime.datetime.strptime(x,'%Y/%m/%d %H:%M:%S') 这个东西接受的字符串形式是:2001/09/01 16:00:20 这种形式的,而我们原文件的时间是2001/9/1 16:00:20这样子的,所以前几行是在进行格式转换。
转换好时间的格式后,就对这个原时间增加y个月,把结果赋值给d。
又因为原数据集的月份和号数前面没有0 ,我就用列表把字符串的形式转换了一下,最后返回符合原数据集格式、并且增加了y个月的时间d。
info=info.set_index('commitdate') time1=starttime path=r"C:\Users\86189\Desktop" for i in range(1,100): info.loc[time1:addtime(time1,2)].to_csv(os.path.join(path,'jdt_fit_'+str(i)+'.csv')) time1=addtime(time1,8) if time1>endtime: break time2=addtime(starttime,4) for j in range(1,100): info.loc[time2:addtime(time2,2)].to_csv(os.path.join(path,'jdt_test_'+str(j)+'.csv')) time2=addtime(time2,8) if time2>endtime: break #这里用了os.path模块 批量生成csv文件
索引列为“commitdate”,初始时间赋值给time1。
来看第一个循环。这里写的循环是rang(1,100),因为当时觉得,这个数据集循环这么多次肯定能分类完,但其实如果数据集更大一点的话,就不太够用了,但是简单预测一下循环需要多少次改一下就ok了;这里直接写了一个info……to_csv就是直接索引特定的几行进行保存,特定的几行为:time1那行~time1+四个月那行,保存完之后把time1加上8个月,便于下次循环继续进行;如果time1>终止时间,说明数据集的训练集已经保存完了,退出循环。
第二个循环是分类并保存测试集的,类似第一个循环的过程。
生成成功!
import pandas as pd import datetime from dateutil.relativedelta import relativedelta import os.path def addtime(x,y): a=list(x) if a[6]=='/': a.insert(5,'0') if a[-2]=='/': a.insert(-1,'0') d=''.join(a) d=datetime.datetime.strptime(x,'%Y/%m/%d %H:%M:%S')+relativedelta(months=y) d=str(d) d=d.replace('-','/') a=list(d) if a[5]=='0': del a[5] if a[-2]=='0': del a[-2] d=''.join(a) return d #函数将时间字符串x分别增加y月并以合适的字符串形式返回 path=r"C:\Users\86189\Desktop\jdt.csv" o=open(path) info=pd.read_csv(o,index_col=0) info.sort_values(by="commitdate") info.to_csv(r"C:\Users\86189\Desktop\jdt.csv") #jdt文件已经排序 o=open(path) info=pd.read_csv(o,index_col=0) starttime=info.iloc[0,0]+':00' endtime=info.iloc[-1,0]+':00' #获得第一次和最后一次的记录时间 info=info.set_index('commitdate') time1=starttime path=r"C:\Users\86189\Desktop" for i in range(1,100): info.loc[time1:addtime(time1,2)].to_csv(os.path.join(path,'jdt_fit_'+str(i)+'.csv')) time1=addtime(time1,8) if time1>endtime: break time2=addtime(starttime,4) for j in range(1,100): info.loc[time2:addtime(time2,2)].to_csv(os.path.join(path,'jdt_test_'+str(j)+'.csv')) time2=addtime(time2,8) if time2>endtime: break #这里用了os.path模块 批量生成csv文件
pandas中iloc和loc的用法:https://blog.csdn.net/w_weiying/article/details/81411257
datatime库的用法:https://www.cnblogs.com/linkenpark/p/8079337.html
pandas的用法:https://www.cnblogs.com/linkenpark/p/8079337.html
还用了os.path批量生成文件