【问题标题】:Randomly sample rows from a file based on times in columns根据列中的时间从文件中随机采样行
【发布时间】:2015-07-22 14:45:29
【问题描述】:

这有点复杂,我非常感谢任何帮助!我正在尝试从 .csv 文件中随机抽样行。本质上,我想要一个包含唯一位置的结果文件(位置由数据文件的EastingNorthing 列指定,如下)。我想在此文件中每个SessionDate 每 12 小时期间随机拉 1 个位置(12 小时期间分为:06311829 小时之间以及 18300630 小时之间;给定为 Start:End: 在下面的数据文件中);但是,如果任何 2 个位置彼此相隔 6 小时内(基于它们的Start: 时间),则该位置将被抛出,并随机抽取一个新位置,并且此采样将继续进行,直到没有新位置被绘制(即,不更换采样)。我一直在尝试用 python 做到这一点,但我的经验非常有限。我尝试先将每一行放入字典,最近将每一行放入一个列表,如下:

import random
import csv

f = open('file.csv', "U")
list = []

for line in f:
    list.append(line.split(','))

我不确定从这里去哪里 - 如何以我需要的方式从这些列表中取样,然后用我的“唯一”位置将它们写入输出文件。

这是我的数据文件的前几行:

SessionDate Start:  End:    Easting Northing
27-Apr-07   18:00   21:45   174739  9785206
28-Apr-07   18:00   21:30   171984  9784738
28-Apr-07   18:00   21:30   171984  9784738
28-Apr-07   18:00   21:30   171984  9784738
28-Apr-07   18:00   21:30   171984  9784738

由于一些观察跨越午夜,所以有点复杂,所以它们可能在不同的日期,但可以在 6 小时之内(这就是我有这个标准的原因),例如:

SessionDate Start:  End:    Easting Northing
27-Apr-07   22:30   23:25   171984  9784738
28-Apr-07   0:25    1:30    174739  9785206

【问题讨论】:

  • 你的 csv 文件中的每一个交替行真的是一个空行吗?
  • CSV 文件有多大——即有多少条目?我们说的是几百?数千?百万?
  • 行是否以某种方式排序? (例如SessionDate
  • 不,我的 CSV 文件中没有空行,我无法清楚地显示它。这些文件的大小从几百行到几千行不等。
  • 行没有排序,但我可以在处理之前轻松排序。

标签: python csv random sampling


【解决方案1】:

这是我的解决方案 - 我对您的数据进行了一些更改(位置以便于查看结果)。我基本上创建了一个dict 的日期指向另一个dict 的位置,这些位置指向一个选定行的列表。

data  = """SessionDate Start:  End:    Easting Northing
27-Apr-07   18:00   21:45   A  1
27-Apr-07   18:00   21:30   G  2
28-Apr-07   18:00   21:30   B  2
28-Apr-07   18:00   21:30   B  2
28-Apr-07   18:00   21:30   B  2
29-Apr-07   8:00    11:30   C 3
29-Apr-07   20:00   21:30   C  3
29-Apr-07   20:00   21:30   C  3
30-Apr-07   8:00   10:30   D  4
30-Apr-07   16:00   17:30   E  5
30-Apr-07   14:00   21:30   F  6
30-Apr-07   18:00   21:30   F  6
"""

selected = {}
for line in data.split("\n"):
    if "Session" in line:
        continue
    if not line:
        continue

    tmp = [x for x in line.split() if x]
    raw_dt = " ".join([tmp[0], tmp[1]]).strip()
    curr_dt = datetime.strptime(raw_dt, "%d-%b-%y %H:%M")
    loc = (tmp[-2], tmp[-1])

    found = False
    for dt in selected:
        diff = dt - curr_dt
        if dt < curr_dt:
            diff = curr_dt - dt
        # print dt, curr_dt, diff, diff <= timedelta(hours=12), loc, loc in selected[dt]            
        if diff <= timedelta(hours=12):
            if loc not in selected[dt]:
                selected[dt].setdefault(loc, []).append(tmp)
                found = True
            else:
                found = True
    if not found:
        if curr_dt not in selected:
            selected[curr_dt] = {}
        if loc not in selected[curr_dt]:
            selected[curr_dt][loc] = [tmp,]

# if output needs to be sorted
rows = sorted(x for k in selected for l in selected[k] for x in selected[k][l])
for row in rows:
    print " ".join(row)

【讨论】:

    【解决方案2】:

    这不是一个完整的答案,但可以为您指明正确的方向

    正如我在评论中所说,在 python 中处理日期时间对象是通过 datetime 模块完成的。这是与您的问题相关的一个小示例:

    from datetime import datetime
    
    d1 = datetime.strptime("27-Apr-07 18:00", "%d-%b-%y %H:%M")
    d2 = datetime.strptime("28-Apr-07 01:00", "%d-%b-%y %H:%M")
    
    difference = d2 - d1
    
    #Difference in hours
    dH = difference.days*24 + difference.seconds/3600
    

    除此之外,只需循环排序文件,在读取整个 12H 块后,随机采样,确保满足您的唯一条件(如果不重复)并继续。

    【讨论】:

      猜你喜欢
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 2017-06-01
      • 2019-10-02
      相关资源
      最近更新 更多