Произвольная выборка строк из файла на основе времени в столбцах

Это немного сложно, и я очень ценю любую помощь! Я пытаюсь случайным образом выбирать строки из файла .csv. По сути, мне нужен результирующий файл уникальных местоположений (местоположения указаны в столбцах Easting и Northing файла данных ниже). Я хочу случайным образом выбрать 1 местоположение за 12-часовой период за SessionDate в этом файле (12-часовые периоды разделены на: между 0631 и 1829 часами и между 1830 и 0630 часами; указаны как 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

person kjc    schedule 11.05.2015    source источник
comment
Действительно ли каждая чередующаяся строка в вашем CSV-файле является пустой строкой?   -  person inspectorG4dget    schedule 12.05.2015
comment
Насколько велик файл CSV, то есть сколько записей? Мы говорим о паре сотен? Тысячи? Миллионы?   -  person erapert    schedule 12.05.2015
comment
Строки как-то сортируются? (например, SessionDate)   -  person jorgeh    schedule 12.05.2015
comment
Нет, в моем CSV-файле нет пустых строк, у меня возникли проблемы с его четким отображением. Файлы содержат от нескольких сотен до нескольких тысяч строк.   -  person kjc    schedule 12.05.2015
comment
Строки не отсортированы, но я мог легко отсортировать их перед обработкой.   -  person kjc    schedule 12.05.2015
comment
Я чувствую, что вам нужно попробовать еще немного, что вы буквально показали только то, что вы можете открыть файл, содержащий нужные вам данные. Мы можем помочь вам, но не делаем ВСЕ за вас из-за того, насколько специфичен этот вопрос. Звучит как домашнее задание.   -  person BilliAm    schedule 12.05.2015
comment
Посмотрите на collections.groupby и random.choice   -  person m.wasowski    schedule 12.05.2015
comment
BilliAm, не стесняйтесь не помогать мне. Я биолог дикой природы, а не программист, и просто пытаюсь получить здесь помощь. Вам не нужно быть грубым/заносчивым по этому поводу.   -  person kjc    schedule 12.05.2015
comment
kjc, какая у тебя локаль? США? ВЕЛИКОБРИТАНИЯ? Канада?   -  person erapert    schedule 12.05.2015
comment
@kjc Как биолог, вы, вероятно, очень хорошо разбираетесь в статистике. Если вы также пытаетесь выучить свой первый язык программирования, Python может быть не лучшим выбором. Учитывая вашу проблемную область и тип анализа, который вы, возможно, захотите провести, могу ли я предложить перейти на R?   -  person kdopen    schedule 12.05.2015
comment
Если ваша проблема связана с обработкой даты и вычислением различий между ними, то datetime Python модуль тебе в помощь.   -  person jorgeh    schedule 12.05.2015


Ответы (2)


Вот мое решение: я внес несколько изменений в ваши данные (местоположение, чтобы было легче просматривать результаты). В основном я создаю 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)
person vikramls    schedule 12.05.2015

Это не полный ответ, но что-то, что укажет вам правильное направление

Как я сказал в комментарии, обработка объектов даты и времени в 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

Кроме этого, просто переберите отсортированный файл, прочитав весь 12-часовой блок, сэмплируйте случайным образом, убедитесь, что ваше уникальное условие выполнено (если не повторите), и двигайтесь дальше.

person jorgeh    schedule 11.05.2015