Python新手问题——大txt文件按条件将多行合并
迷茫
迷茫 2017-04-18 10:34:26
0
8
667

数据格式如下:
······
1107 1385331000000 1.3142511607126754
1107 1385331000000 0.0021683196661660157
1107 1385331600000 0.0021683196661660157
1107 1385331600000 1.4867805985670923
1107 1385331600000 0.0021683196661660157
1107 1385332200000 1.1697626938303243
1107 1385332800000 0.0021683196661660157
1107 1385332800000 0.005813069022279304
1107 1385332800000 1.2847329440609827
1107 1385332800000 0.0021683196661660157
1107 1385333400000 1.2891586380834603
1108 1385247600000 0.026943168177151356
1108 1385247600000 6.184696475262653
1108 1385248200000 0.05946288920050806
1108 1385248200000 6.359572785335356
1108 1385248200000 0.010602880590260044
1108 1385248800000 0.026943168177151356
1108 1385248800000 5.568047923787272
1108 1385249400000 0 0.01024202685104009
1108 1385249400000 5.213017822855314
1108 1385250000000 0.01024202685104009
1108 1385250000000 5.385327254217893
1108 1385250600000 0.016259860511678353
1108 1385250600000 4.902644074658115
1108 1385251200000 4.141288808488436
1108 1385251800000 0.05388633635430271
1108 1385251800000 4.684096694966861
1108 1385251800000 0.01024202685104009
1108 1385252400000 4.386580113177049
1108 1385253000000 4.582219390797833
1108 1385253600000 5.211061096279831
1108 1385254200000 0.02048405370208018
1108 1385254200000 3.901546051563316
1108 1385254200000 0.01024202685104009
1108 1385254800000 4.0387888693118255
······
每一行数据间是tab键隔开的
第一列是标号,第二列是UTC格式时间戳,第三列是流量数据,每行的数据是10分钟内的,现在想把同一个标号的比如第一列为1107的每一小时的数据叠加起来成为新的一行(第二列的时间可以用时间戳表示或者以时间间隔表示),完全没有头绪,请大神指点指点

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回覆(8)
黄舟

自己解決了,雖然可能比較複雜,但能滿足需求

__author__ = 'Administrator'
file = open('day24.txt', 'a+')
s = "area       time            data\n"
file.write(s)
file.close


file = open('sms-call-internet-mi-2013-11-24-24.txt','r')
line = file.readline()
list1 = []#时间
num1 = []#data
area = []

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%.20f\n" % (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:
        break
file.close

file = open('day24.txt', 'a+')
for j in list1: 
    file.write("%-8s%-16s%.20f\n" % (a[0], j, float(num1[list1.index(j)])))
file.close
file = open('day24.txt', 'r')
file.close
左手右手慢动作

如果是按照時間序列的,直接使用generator來讀取原始文件,產生新的行然後輸出就可以了.

左手右手慢动作

pandas可以解決你的需求,讀取資料到dataframe再處理

刘奇

這個要看你的數據量有多大了

  1. 使用 檔案句柄遍歷 不用用 readlines() (記憶體可能不夠)

  2. 使用類似字典一樣的資料結構來儲存你的訊息,如果記憶體不夠,就要再想辦法,中間訊息寫磁碟等。

大概的思路如下

from collections import Counter
c = 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]
PHPzhong

你這個等於就是基於標號和小時兩個指標分組統計,用pandas讀入,用to_datetime將時間戳轉換為時間列再取小時數,然後用groupby同時對標號和小時進行分類,sum匯總就行了。

黄舟

請用這個想法
https://www.zhihu.com/questio...

阿神

我覺得你這個資料格式可以稍加分析一下再做
1.第一列表示日期,你可以做為結果數組的第一層的鍵,result[date]
2.第二列看著應該是時間(分鐘)的時間戳,這樣你要求按小時來做結果,你就每個result[data]項初始化24個元素,鍵就是小時數(可以用相應的小時數的時間戳的值做鍵) ,鍵值對應的就是這個小時內的資料總和,即resultdate
3.初始化完成這個結果數組以後就簡單了,你就遍歷文件,逐行處理就可以了,每一行先讀取第一列的值,例如1107,
就操作result[1107]。接著讀取第二列,找到對應的hourtimestamp鍵,累加就行了。
4.最後遍歷result數組,輸出結果就行了。

Peter_Zhu

你需要:

from itertools import groupby

不到十行程式碼就可以搞定的。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板