pandas排序csv文件并且按时间分类 python学习 pandas应用

具体实现功能: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>终止时间,说明数据集的训练集已经保存完了,退出循环。

第二个循环是分类并保存测试集的,类似第一个循环的过程。

pandas排序csv文件并且按时间分类 python学习 pandas应用

生成成功! 

六、完整代码

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批量生成文件

上一篇:RhinoCommon Split Brep with multiple Breps


下一篇:根据cron规则获取下次执行时间