【问题标题】:CSV Files in Python (Sliding Window)Python 中的 CSV 文件(滑动窗口)
【发布时间】:2017-01-16 04:54:39
【问题描述】:

我是 Python 的初学者,我需要在 Python 中处理 csv 文件方面的帮助。 我正在尝试为数据集中的每一行做滑动窗口机制。

例如,如果数据集是这样的

timestamp | temperature | windspeed
965068200   9.61883  60.262   
965069100   9.47203  60.1664 
965070000   9.31125  60.0145   
965070900   9.13649  59.8064

如果用户指定的窗口大小为 3,则结果应该类似于

timestamp | temperature-2 | temperature-1 |temperature-0 | windspeed-2 | windspeed-1 | windspeed-0
965070000   9.61883 9.47203 9.31125 60.262 60.1664 60.0145
965070900   9.47203 9.31125 9.13649 60.1664 60.0145 59.8064

我可以通过在 Java.Reading CSV 中使用 List of ObjectsArray 来做到这一点,并生成新的 CSV,其中包含转换后的数据集。 这是代码 http://pastebin.com/cQnTBg8d#研究

我需要用 Python 做这个,请帮我解决这个问题。

谢谢

【问题讨论】:

  • 你看过csv模块了吗?
  • 这实际上看起来不像实际的 csv,因此使用字符串方法可能更容易。
  • 你的 csv 大吗?可以留在记忆中吗?
  • 感谢@FloranGmehlin 的提问,这里是CSV sharecsv.com/s/f193721233146a16a1032c42d8a33517/… 文件的链接实际上包含961 行。

标签: java python csv dataset pycharm


【解决方案1】:

此答案假定您使用的是 Python 3.x - 对于 Python 2.x,需要进行一些更改(对一些明显的地方进行了注释)

对于问题中的数据格式,这可能是 Python 的起点:

import collections

def slide(infile,outfile,window_size):
    queue=collections.deque(maxlen=window_size)
    line=infile.readline()
    headers=[s.strip() for s in line.split("|")]
    row=[headers[0]]
    for h in headers[1:]
        for i in reversed(range(window_size)):
            row.append("%s-%i"%(h,i))
    outfile.write(" | ".join(row))
    outfile.write("\n")
    for line in infile:
        queue.append(line.split())
        if len(queue)==window_size:
            row=[queue[-1][0]]
            for j in range(1,len(headers)):
                for old in queue:
                    row.append(old[j])
            outfile.write("\t".join(row))
            outfile.write("\n")

ws=3
with open("infile.csv","r") as inf:
    with open("outfile.csv","w") as outf:
        slide(inf,outf,ws)

实际上,这段代码是关于使用队列来保留窗口的输入行,而不是更多 - 其他都是 text-to-list-to-text。

使用实际的 csv 数据(见评论)

import csv
import collections

def slide(infile,outfile,window_size):
    r=csv.reader(infile)
    w=csv.writer(outfile)
    queue=collections.deque(maxlen=window_size)
    headers=next(r) # r.next() on python 2
    l=[headers[0]]
    for h in headers[1:]
        for i in reversed(range(window_size)):
            l.append("%s-%i"%(h,i))
    w.writerow(l)
    hrange=range(1,len(headers))
    for row in r:
        queue.append(row)
        if len(queue)==window_size:
            l=[queue[-1][0]]
            for j in hrange:
                for old in queue:
                    l.append(old[j])
            w.writerow(l)

ws=3
with open("infile.csv","r") as inf: # rb and no newline param on python 2
    with open("outfile.csv","w") as outf: # wb and no newline param on python 2
        slide(inf,outf,ws)

【讨论】:

  • 感谢您的支持@janbrohl ,我猜这行有错误。 headers=[s.strip() for s infile.readline().strip().strip("*").split("|")]。请提及问题现在已编辑。
  • 相应改变
  • 感谢您的努力@janbrohl,由于一些错误,我无法编译。你也能解决这个问题吗? i.imgsafe.org/14dea045e4.png
  • 对不起,程序正在运行,没有生成 csv 文件。 sharecsv.com/s/f193721233146a16a1032c42d8a33517/… - 输入 csv i.imgsafe.org/1537fe2714.png - IDE 你的帮助会更有价值。
  • 如果您在问题中直接发布 cvs-data 会很棒 - 我的回答是针对您问题中示例数据集的格式
猜你喜欢
  • 2016-03-06
  • 2020-04-10
  • 2013-04-05
  • 2021-06-14
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多