Python根据字段值将文本文件切片到数组中

时间:2016-02-28 07:15:14

标签: python arrays timestamp

我是Python的新手,我想阅读一个包含三个字段的文本文件; XYTime。我想从x和y字段形成数组,只要时间字段仍然是常量。例如:

X    Y     Time
1    2     100
3    4     100
5    6     100
7    8     200
9    10    200

因此,对于time = 100,我构建x_array = [1,3,5]y_array = [2,4,6]作为其他进程的输入,然后在时间更改为200时返回更新它们。 谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

解决方案

您可以使用pandas

>>> import pandas as pd

>>> df = pd.read_csv('my_data.csv', delim_whitespace=True)

>>> df.groupby('Time')['X'].apply(list).to_dict()
{100: [1, 3, 5], 200: [7, 9]}

>>> df.groupby('Time')['Y'].apply(list).to_dict()
{100: [2, 4, 6], 200: [8, 10]}

说明

这会读取你的文件:

df = pd.read_csv('my_data.csv', delim_whitespace=True)

进入这样的数据框:

enter image description here

现在,您按Time进行分组,并将X中的条目转换为列表:

df.groupby('Time')['X'].apply(list)

这给你这个熊猫系列:

Time
100    [1, 3, 5]
200       [7, 9]
Name: X, dtype: object

最后,使用to_dict()将其转换为字典:

>>> df.groupby('Time')['X'].apply(list).to_dict()
{100: [1, 3, 5], 200: [7, 9]}

替代解决方案:

这为您提供了不同的结果排列:

>>> df.groupby('Time').apply(lambda x: {'X': list(x['X']), 'Y': list(x['Y'])}).to_dict()
{100: {'X': [1, 3, 5], 'Y': [2, 4, 6]}, 200: {'X': [7, 9], 'Y': [8, 10]}}

答案 1 :(得分:0)

你需要一个基于时间的密钥字典,其中包括:

with open('file.txt') as f:
    data = {}
    next(f)    # Skip header
    for line in f:
        x, y, time = map(int, line.strip().split())
        data.setdefault(time, {})
        data[time].setdefault('X', []).append(x)
        data[time].setdefault('Y', []).append(y)
data
# {100: {'X': [1, 3, 5], 'Y': [2, 4, 6]}, 200: {'X': [7, 9], 'Y': [8, 10]}}

答案 2 :(得分:0)

这似乎是defaultdict应该完全涵盖csv模块DictReader的任务。这为解析创建了一段非常易读的代码:

import csv
from collections import defaultdict

# these two will hold xs and ys by time point
xs = defaultdict(list)
ys = defaultdict(list)

with open("yourfile.csv") as csvfile:
    reader = csv.DictReader(csvfile, delimiter='\t')
    for row in reader:
         # get time point for row
        t = row['Time']
        # add x point
        xs[t].append(row['X'])
        # add y point
        ys[t].append(row['Y'])

print xs
print ys

输出:

  

defaultdict(,{'200':['7','9'],'100':['1','3','5']})

     

defaultdict(,{'200':['8','10'],'100':['2','4','6']})