具体实现功能: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批量生成文件