Нахождение двух каталогов (которые находятся в десятиминутной корзине) на основе времени. Дьявольская директория катастрофы - PullRequest
0 голосов
/ 15 января 2019

Я оглянулся и не могу найти рабочее решение. Немного фона:

Я использую R для поиска необработанных изображений на основе проверенного имени изображения (все это работает). Проблема в том, что существует не менее 30 каталогов дат, в каждом из которых имеется большое количество временных каталогов, которые разделены на 10-минутные бины. Поиск во всех бинах или только в родительском каталоге требует слишком много вычислений. Примером формата корзины будет

 R_Experiments\RawImageFinder\Raw\2016-10-08\1536
 R_Experiments\RawImageFinder\Raw\2016-10-08\1546

Важно отметить, что ячейки не соответствуют их начальным минутам; это может измениться, и здесь во лжи проблема.

Я знаю, в какое время изображение было взято из имени файла, используя следующий бит кода

SingleImage <- Pia1.2016-10-08.1103+N2353_hc.tif
TimeDir <- sub('.*?\\.\\d{4}-\\d{2}-\\d{2}\\.(\\d{2})(\\d{2}).*', '\\1:\\2', SingleImage)
TimeDir <- sub(':','', TimeDir)
#
> print(TimeDir)
[1] "1103"

Таким образом, изображение может находиться в любой из следующих корзин:

 \1053,\1054,\1055,..you get the idea...,\1112,\1113

это зависит только от того, когда корзина была запущена. Поэтому я хочу, чтобы код "поиска" просматривал все возможные ячейки, которые находятся в пределах минимальных значений с обеих сторон (как в примере выше), очевидно, что некоторые из них не будут существовать. Я думал о том, чтобы сделать:

TimeDir1 <- as.numeric(TimeDir)+1
TimeDir2 <- as.numeric(TimeDir)+2

но проблема возникает, если мы доберемся до 59 минут, потому что нет такой вещи, как 61 минута в час (ха-ха).

Затем я использую следующее, чтобы указать, какие каталоги искать, хотя я немного застрял и в том, как заставить его искать в нескольких каталогах.

  Directorytosearch <- ParentDirectory
 #this has the \ in it, same for time, it works
  Directorytosearch <- sub('$',paste(DateDir), Directorytosearch)
  Directorytoserach <- sub('$',paste(TimeDir), Directorytoserach)


  IMAGEtocopy <- list.files(
      path = c(Directorytosearch),
      recursive = TRUE,
      include.dirs = FALSE,
      full.names = FALSE,
      pattern = SingleImagePattern)

Любая помощь действительно была бы великолепна! Может быть, использовать функцию strptime? Большое спасибо

Jim

Обновление для @ Nya

test <- strptime("1546", format = "%H%M")
dirs[select.image.dir(test, dirs.time)]
> dirs[select.image.dir(test, dirs.time)]
[1] "test/1546"

1 Ответ

0 голосов
/ 15 января 2019

Для просмотра каталогов вы ищете функцию list.dirs(). Предположим, что при таком поиске по всем каталогам был получен следующий пример.

# directories possibly obtained with list.dirs
dirs <- c("test/1536", "test/1546", "test/1556", "test/1606")

Тогда хорошей практикой будет извлечение компонентов даты и времени из каталогов и имен файлов изображений. Здесь я буду использовать только время, так как это был первоначальный запрос.

# convert times
dirs.time <- sub(".*/(\\d+)$", "\\1", dirs)
dirs.time <- strptime(dirs.time, format="%H%M")

# test data, in your case from image file names
test <- strptime(c("1538", "1559", "1502"), format="%H%M")

Функция, которая выберет нужные каталоги путем сравнения, если время из файла изображения находится в пределах 10-минутного интервала вверх и вниз по времени каталога. Затем он предоставит индексы, где изображение может быть расположено.

select.image.dir <- function(i, dt){
    res <- NULL
    # adding and substracting 10 minutes converted to seconds
    ik <- c(i - 600, i + 600)
    condition <- c(ik[1] <= dt & ik[2] >= dt)
    if(any(condition)){
        res <- which(condition)
    } else { res <- NA }
    res
}    

Обратите внимание, что обновленная функция принимает время одного файла изображения для проверки в каждом раунде. Индексы могут затем использоваться для извлечения пути к каталогу изображений. Последний раз находится за пределами диапазона каталогов, поэтому функция возвращает NA.

dirs[select.image.dir(test[1], dirs.time)]
# [1] "test/1536" "test/1546"
dirs[select.image.dir(test[2], dirs.time)]
# [1] "test/1556" "test/1606"
dirs[select.image.dir(test[3], dirs.time)]
# [1] NA NA NA NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...