ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-07-26 19:02:39  阅读:319  来源: 互联网

标签:info python addtime time1 time2 path csv 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>终止时间,说明数据集的训练集已经保存完了,退出循环。

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

生成成功! 

六、完整代码

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

标签:info,python,addtime,time1,time2,path,csv,pandas
来源: https://blog.csdn.net/m0_46362426/article/details/119115622

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有