导入文本文件以处理特定列

Posted

技术标签:

【中文标题】导入文本文件以处理特定列【英文标题】:import text file to process specific columns 【发布时间】:2016-05-05 08:15:27 【问题描述】:

我是 python 使用的新手。但要通过实践学习在我的数据处理中使用。

我有一个格式如下所示的大数据文件。 行数和列数总是未知。在此示例中,显示了 2 个连续的行。 第 1 列是“时间”,第 n 列是要从标识符中选择的相关数据(第一行中的“abc”)。

................“2013-01-01 00:00:02” 228 227 15.65 15.84强> 14.85 14.68 14.53 13.75 12.45 12.55“2013-01-02 00:01:03” 225 227 16.35 15.99 14.85 14.73 14.43 13.8 12.85 13.2 ......

期望的输出为

    Column1 = 以时间表示,因此时间差可以是 计算出来的。 列 (n) = 要进一步处理的数据,应位于 浮动。

在我过去的试验中,我最终出现在列表中,因此无法转换任一列。

我试图搜索过去的问题和答案。但未能解释所有,因为我是一个初学者。我希望您能快速帮助将数据读入列格式,以便以后处理。我相信,可以进行进一步的处理,因为它是更多的数学运算。

真的很感谢你的帮助。

问候 古里

CORRECTION-1:我知道 pandas 提供了一个紧凑的版本来提取我之前需要的列。小组建议后学习良好。 代码如下:

import pandas as pd
data = pd.read_csv(fp, sep='\t')
entry=[]
entry = data['u90']
print entry, '\n', entry[5]

out_file = open("out.txt", "w")
entry.to_csv(out_file)

问候 古里

【问题讨论】:

这是一个经常被问到的问题,例如使用pandas 来读取您的数据 作为 python 编码的新手,pandas 似乎有点难以理解。我会保留这个以供我进一步练习。这也是我任务的一部分。因此,期待通过简单的代码练习更快地解决问题。最重要的是,感谢您的建议。 根据 Hugo 的建议,我尝试了 pandas,它非常有效。 【参考方案1】:

如果您对使用正则表达式而不是 pandas 感兴趣,那么对于您的数据集,以下代码有效。

import re

#l1 = ["\"2013-01-01 00:00:02\" 228 227 15.65 15.84 14.85 14.68 14.53 13.75 12.45 12.55",
#"\"2013-01-02 00:01:03\" 225 227 16.35 15.99 14.85 14.73 14.43 13.8 12.85 13.2"]

l1 = """"2013-01-01 00:00:02\" 228 227 15.65 15.84 14.85 14.68 14.53 13.75 12.45 12.55
"2013-01-02 00:01:03\" 225 227 16.35 15.99 14.85 14.73 14.43 13.8 12.85 13.2"""

l_match = re.findall(r'(\d4-\d2-\d2 \d2:\d2:\d2)\"\s\d+\s\d+\s\d+\.\d+\s(\d+\.\d+)',l1)

if l_match:
    for each_find in l_match:
        l_date = each_find[0]
        l_number = float(each_find[1])
        print l_date
        print l_number

输出

2013-01-01 00:00:02
15.84
2013-01-02 00:01:03
15.99

【讨论】:

使用 pandas 后,我可以在列数组中获取其他条目和时间为 '2013-01-01 00:00:00', '2013-01-01 00:00:01'等等。我希望在减去基本时间后以秒为单位转换这些值(例如,'2013-01-01 00:00:00')。这将导致修改后的数据为 0、1、......(以秒为单位)。请提供任何帮助。【参考方案2】:

正如 Hugo Honorem 在评论中指出的那样,您可以使用pandas。

如果你不想在你的项目中引入更多的依赖,你可以使用这样的函数:

from operator import itemgetter

def load_dataset(fp, columns, types=None, delimiter=' ', skip_header=True):
    get_columns = itemgetter(*columns)
    if skip_header:
        next(fp)
    dataset = []
    for line in fp:
        parts = line.split(delimiter)
        columns = get_columns(parts)
        if types is not None:
            columns = [convertor(col) for convertor, col in zip(types, columns)]
        dataset.append(columns)
    return dataset

columns 应该是整数列表,types 是可调用对象的列表,这些对象将所需的列转换为您想要的类型。对于浮点数,只需传入float,对于您的日期,您可以传递自定义to_date 函数。

【讨论】:

【参考方案3】:

您拥有的是一个 CSV 文件,其中空格作为分隔符,因此您可以使用 CSV 库 (https://docs.python.org/2/library/csv.html)。否则,您可以逐行读取并使用 split() 进行解析

f = open('myfile.csv','r')
for line in f.readlines():
    date = line.split(' ')[0]
    value = line.split(' ')[N]

其中 N 是您的值所在的列(在您的示例中为 4)。

不过,我强烈推荐 pandas,它会让你的代码质量更上一层楼。

【讨论】:

这段代码可以正常工作,开始时有一个小的更改为 'date = line.split('\t')[0]'。

以上是关于导入文本文件以处理特定列的主要内容,如果未能解决你的问题,请参考以下文章

如何从批处理脚本中获取特定的标准输出以重定向到文本文件

SQL Server 导入导出向导 - 日期时间错误 - 特定值

SSIS 处理缺少文本限定符的平面文件

如何在文本文件中逐行替换特定行?

把txt文本数据导入sql2000数据库中,如何实现

Linux高级文本处理命令