Maison  >  Questions et réponses  >  le corps du texte

Python新手问题——大txt文件按条件将多行合并

数据格式如下:
······
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的每一小时的数据叠加起来成为新的一行(第二列的时间可以用时间戳表示或者以时间间隔表示),完全没有头绪,请大神指点指点

迷茫迷茫2741 Il y a quelques jours651

répondre à tous(8)je répondrai

  • 黄舟

    黄舟2017-04-18 10:36:26

    Je l'ai résolu moi-même. Même si cela peut être compliqué, cela peut répondre aux besoins

    __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
    

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-18 10:36:26

    S'il est basé sur des séries chronologiques, utilisez simplement le générateur pour lire le fichier original, générer de nouvelles lignes puis le sortir.

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-18 10:36:26

    les pandas peuvent résoudre vos besoins, lire les données dans un dataframe puis les traiter

    répondre
    0
  • 怪我咯

    怪我咯2017-04-18 10:36:26

    Cela dépend de la quantité de données dont vous disposez

    1. Utilisez la traversée des descripteurs de fichiers, n'utilisez pas readlines() (la mémoire peut ne pas être suffisante)

    2. Utilisez une structure de données similaire à un dictionnaire pour stocker vos informations. Si la mémoire n'est pas suffisante, vous devez trouver un moyen d'écrire les informations intermédiaires sur le disque, etc.

    L'idée générale est la suivante

    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]

    répondre
    0
  • PHPz

    PHPz2017-04-18 10:36:26

    Ce que vous faites, c'est regrouper les statistiques en fonction de deux indicateurs : l'étiquette et l'heure. Utilisez pandas pour lire, utilisez to_datetime pour convertir l'horodatage en colonne d'heure, puis utilisez groupby pour classer l'étiquette. et l'heure en même temps, et résumez-le.

    répondre
    0
  • 黄舟

    黄舟2017-04-18 10:36:26

    Veuillez utiliser cette idée
    https://www.zhihu.com/questio...

    répondre
    0
  • 阿神

    阿神2017-04-18 10:36:26

    Je pense que votre format de données peut être analysé un peu avant de le faire
    1 La première colonne représente la date, vous pouvez l'utiliser comme clé du premier niveau du tableau de résultats, result[date]<🎜. >2. La deuxième colonne doit être l'horodatage (minutes), donc si vous avez besoin du résultat par heure, vous initialisez 24 éléments pour chaque élément de résultat [données], et la clé est le nombre d'heures (vous pouvez utiliser le nombre d'heures correspondant) La valeur du tampon est utilisée comme clé), et la valeur de la clé correspond à la somme des données dans cette heure, c'est-à-dire resultdate
    3 Après avoir initialisé le tableau de résultats, c'est simple. . Il vous suffit de parcourir le fichier et de le traiter ligne par ligne. Chaque ligne, lisez d'abord la valeur de la première colonne, telle que 1107,
    puis exécutez le résultat[1107]. Lisez ensuite la deuxième colonne, recherchez la clé d'horodatage correspondante et additionnez-la simplement.
    4. Enfin, parcourez le tableau de résultats et affichez le résultat.

    répondre
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:36:26

    Il vous faut :

    from itertools import groupby

    Cela peut être fait en moins de dix lignes de code.

    répondre
    0
  • Annulerrépondre