根据列中的时间从文件中随机抽样行

时间:2015-05-11 22:40:18

标签: python csv random sampling

这有点复杂,我非常感谢任何帮助!我试图从.csv文件中随机抽样行。基本上,我想要一个唯一位置的结果文件(位置由数据文件的EastingNorthing列指定,如下所示)。我想在此文件中按SessionDate每12小时随机抽取一个位置(12小时时段分为:06311829小时之间以及1830和{{之间1}}小时;在数据文件中给出0630Start:,如下所示);但是,如果任何2个位置在彼此的6小时内(基于他们的End:时间),要被投掷的位置,以及随机抽取的新位置,并且此采样将继续直到没有新的位置被绘制(即,没有替换的采样)。我一直试图用python做这个,但我的经验非常有限。我尝试先将每一行放入一个字典中,最近将每一行放入一个列表中,如下所示:

Start:

我不确定从哪里开始 - 如何从我需要的方式中对这些列表进行采样,然后将其写入输出文件中,并使用我的独特'位置。

以下是我的数据文件的前几行:

import random
import csv

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

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

有些复杂,因为有些观察时间跨度是午夜,所以它们可能在不同的日期,但可能在6个小时之内(这就是为什么我有这个标准),例如:

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

2 个答案:

答案 0 :(得分:0)

这是我的解决方案 - 我对您的数据进行了一些更改(位置以便更容易观察结果)。我基本上创建了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)

答案 1 :(得分:-1)

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

正如我在评论中所说,在python中处理datetime对象是使用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块之后,对ramdomly进行采样,确保满足您的独特条件(如果不重复)并继续前进。