Python新手問題——大txt文件按條件將多行合并
問題描述
數(shù)據(jù)格式如下:······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······每一行數(shù)據(jù)間是tab鍵隔開的第一列是標(biāo)號(hào),第二列是UTC格式時(shí)間戳,第三列是流量數(shù)據(jù),每行的數(shù)據(jù)是10分鐘內(nèi)的,現(xiàn)在想把同一個(gè)標(biāo)號(hào)的比如第一列為1107的每一小時(shí)的數(shù)據(jù)疊加起來(lái)成為新的一行(第二列的時(shí)間可以用時(shí)間戳表示或者以時(shí)間間隔表示),完全沒有頭緒,請(qǐng)大神指點(diǎn)指點(diǎn)
問題解答
回答1:自己解決了,雖然可能比較復(fù)雜,但是能滿足需求
__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 = []#時(shí)間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:
如果是按照時(shí)間序列的,直接使用generator來(lái)讀取原文件,生成新的行然后輸出就可以了.
回答3:pandas可以解決你的需求,讀取數(shù)據(jù)到dataframe中再進(jìn)行處理
回答4:這個(gè)要看你的數(shù)據(jù)量有多大了
使用 文件句柄遍歷 不用用 readlines() (內(nèi)存可能不夠)
使用類似于字典一樣的數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)你的信息,如果內(nèi)存不夠,就要再想辦法,中間信息寫磁盤等。
大概的思路如下
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 文件遍歷句柄,相當(dāng)于上面的 list f for i in f:s = i.split()c[s[0]] += s[2]’’’for i in f: # 這里是遍歷 f, 這里遍歷的是 list f, 你實(shí)際情況要用上面的 f s = i.split() # 這里是空格分割,可以使用 print s 看看結(jié)果 c[s[0]] += float(s[2]) # c 用來(lái)統(tǒng)計(jì)for i in c: print i, c[i]回答5:
你這個(gè)等于就是基于標(biāo)號(hào)和小時(shí)兩個(gè)指標(biāo)分組統(tǒng)計(jì),用pandas讀入,用to_datetime將時(shí)間戳轉(zhuǎn)化為時(shí)間列再取小時(shí)數(shù),然后用groupby同時(shí)對(duì)標(biāo)號(hào)和小時(shí)進(jìn)行分類,sum匯總就行了。
回答6:請(qǐng)用這個(gè)思路https://www.zhihu.com/questio...
回答7:我覺得你這個(gè)數(shù)據(jù)格式可以稍加分析一下再做1.第一列表示日期,你可以做為結(jié)果數(shù)組的第一層的鍵,result[date]2.第二列看著應(yīng)該是時(shí)間(分鐘)的時(shí)間戳,這樣你要求按小時(shí)來(lái)做結(jié)果,你就每個(gè)result[data]項(xiàng)初始化24個(gè)元素,鍵就是小時(shí)數(shù)(可以用相應(yīng)的小時(shí)數(shù)的時(shí)間戳的值做鍵),鍵值對(duì)應(yīng)的就是這個(gè)小時(shí)內(nèi)的數(shù)據(jù)總和,即resultdate3.初始化完成這個(gè)結(jié)果數(shù)組以后就簡(jiǎn)單了,你就遍歷文件,逐行處理就可以了,每一行先讀取第一列的值,比如1107,就操作result[1107]。接著讀取第二列,找到對(duì)應(yīng)的hourtimestamp鍵,累加就行了。4.最后遍歷result數(shù)組,輸出結(jié)果就行了。
回答8:你需要:
from itertools import groupby
不到十行代碼就可以搞定的。
相關(guān)文章:
1. spring-mvc - spring-session-redis HttpSessionListener失效2. IOS app應(yīng)用軟件的id號(hào)怎么查詢?比如百度貼吧的app-id=4779278133. html - angular項(xiàng)目中如何讓外鏈網(wǎng)頁(yè)在本項(xiàng)目中展示?4. 淺談Vue使用Cascader級(jí)聯(lián)選擇器數(shù)據(jù)回顯中的坑5. 運(yùn)行python程序時(shí)出現(xiàn)“應(yīng)用程序發(fā)生異常”的內(nèi)存錯(cuò)誤?6. java中double類型轉(zhuǎn)換為String類型?7. javascript - 最近用echarts做統(tǒng)計(jì)圖時(shí)遇到兩個(gè)問題!!8. javascript - 在 model里定義的 引用表模型時(shí),model為undefined。9. mysql - 查詢 修改數(shù)據(jù)庫(kù)優(yōu)化問題吧10. linux - 將java項(xiàng)目部署在vbox的centos系統(tǒng)上,無(wú)法實(shí)現(xiàn)外網(wǎng)訪問到j(luò)ava項(xiàng)目

網(wǎng)公網(wǎng)安備