Python新手问题——大txt文件按条件将多行合并
问题描述
数据格式如下:······1107 1385331000000 1.31425116071267541107 1385331000000 0.00216831966616601571107 1385331600000 0.00216831966616601571107 1385331600000 1.48678059856709231107 1385331600000 0.00216831966616601571107 1385332200000 1.16976269383032431107 1385332800000 0.00216831966616601571107 1385332800000 0.005813069022279304 1107 1385332800000 1.28473294406098271107 1385332800000 0.00216831966616601571107 1385333400000 1.28915863808346031108 1385247600000 0.0269431681771513561108 1385247600000 6.1846964752626531108 1385248200000 0.059462889200508061108 1385248200000 6.3595727853353561108 1385248200000 0.0106028805902600441108 1385248800000 0.0269431681771513561108 1385248800000 5.5680479237872721108 1385249400000 0 0.010242026851040091108 1385249400000 5.2130178228553141108 1385250000000 0.010242026851040091108 1385250000000 5.3853272542178931108 1385250600000 0.016259860511678353 1108 1385250600000 4.9026440746581151108 1385251200000 4.1412888084884361108 1385251800000 0.05388633635430271 1108 1385251800000 4.6840966949668611108 1385251800000 0.010242026851040091108 1385252400000 4.3865801131770491108 1385253000000 4.5822193907978331108 1385253600000 5.2110610962798311108 1385254200000 0.020484053702080181108 1385254200000 3.9015460515633161108 1385254200000 0.010242026851040091108 1385254800000 4.0387888693118255······每一行数据间是tab键隔开的第一列是标号,第二列是UTC格式时间戳,第三列是流量数据,每行的数据是10分钟内的,现在想把同一个标号的比如第一列为1107的每一小时的数据叠加起来成为新的一行(第二列的时间可以用时间戳表示或者以时间间隔表示),完全没有头绪,请大神指点指点
问题解答
回答1:自己解决了,虽然可能比较复杂,但是能满足需求
__author__ = ’Administrator’file = open(’day24.txt’, ’a+’)s = 'area time datan'file.write(s)file.closefile = open(’sms-call-internet-mi-2013-11-24-24.txt’,’r’)line = file.readline()list1 = []#时间num1 = []#dataarea = []while 1: line = file.readline() if line == ’’:break a = line.split() if int(a[0]) == 1:if a[2] == 'NA': a[2] = ’0’area.append(a[0])if a[1] in list1: num1[list1.index(a[1])] = float(num1[list1.index(a[1])])+float(a[2])else: list1.append(a[1]) num1.append(a[2]) elif int(a[0]) < 10001:if a[2] == 'NA': a[2] = ’0’if a[0] not in area: area.append(a[0]) file1 = open(’day24.txt’, ’a+’) for i in list1:file1.write('%-8s%-16s%.20fn' % (area[area.index(a[0])-1], i, float(num1[list1.index(i)]))) file1.close file1 = open(’day24.txt’, ’r’) file1.close list1 = [] num1 = []if a[1] in list1: num1[list1.index(a[1])] = float(num1[list1.index(a[1])])+float(a[2])else: list1.append(a[1]) num1.append(a[2]) else:breakfile.closefile = open(’day24.txt’, ’a+’)for j in list1: file.write('%-8s%-16s%.20fn' % (a[0], j, float(num1[list1.index(j)])))file.closefile = open(’day24.txt’, ’r’)file.close回答2:
如果是按照时间序列的,直接使用generator来读取原文件,生成新的行然后输出就可以了.
回答3:pandas可以解决你的需求,读取数据到dataframe中再进行处理
回答4:这个要看你的数据量有多大了
使用 文件句柄遍历 不用用 readlines() (内存可能不够)
使用类似于字典一样的数据结构来存储你的信息,如果内存不够,就要再想办法,中间信息写磁盘等。
大概的思路如下
from collections import Counterc = Counter()f = [’1107 1385332800000 1.2847329440609827’,’1107 1385332800000 0.0021683196661660157’,’1107 1385333400000 1.2891586380834603’,’1108 1385247600000 0.026943168177151356’,’1108 1385247600000 6.184696475262653’,’1108 1385248200000 0.05946288920050806’ ]’’’with open(’xxoo.txt’) as f: # f 文件遍历句柄,相当于上面的 list f for i in f:s = i.split()c[s[0]] += s[2]’’’for i in f: # 这里是遍历 f, 这里遍历的是 list f, 你实际情况要用上面的 f s = i.split() # 这里是空格分割,可以使用 print s 看看结果 c[s[0]] += float(s[2]) # c 用来统计for i in c: print i, c[i]回答5:
你这个等于就是基于标号和小时两个指标分组统计,用pandas读入,用to_datetime将时间戳转化为时间列再取小时数,然后用groupby同时对标号和小时进行分类,sum汇总就行了。
回答6:请用这个思路https://www.zhihu.com/questio...
回答7:我觉得你这个数据格式可以稍加分析一下再做1.第一列表示日期,你可以做为结果数组的第一层的键,result[date]2.第二列看着应该是时间(分钟)的时间戳,这样你要求按小时来做结果,你就每个result[data]项初始化24个元素,键就是小时数(可以用相应的小时数的时间戳的值做键),键值对应的就是这个小时内的数据总和,即resultdate3.初始化完成这个结果数组以后就简单了,你就遍历文件,逐行处理就可以了,每一行先读取第一列的值,比如1107,就操作result[1107]。接着读取第二列,找到对应的hourtimestamp键,累加就行了。4.最后遍历result数组,输出结果就行了。
回答8:你需要:
from itertools import groupby
不到十行代码就可以搞定的。
相关文章:
1. docker镜像push报错2. docker网络端口映射,没有方便点的操作方法么?3. docker内创建jenkins访问另一个容器下的服务器问题4. 前端 - angular报错?5. debian - docker依赖的aufs-tools源码哪里可以找到啊?6. dockerfile - 为什么docker容器启动不了?7. golang - 用IDE看docker源码时的小问题8. Docker for Mac 创建的dnsmasq容器连不上/不工作的问题9. 在windows下安装docker Toolbox 启动Docker Quickstart Terminal 失败!10. angular.js - angular内容过长展开收起效果