如何根据R中的datetime文件名选择文件?

时间:2013-04-02 15:47:13

标签: r filenames

我有一组具有以下名称的文件:

lineal_fit_coef_yymmddhhmmss.csv

我想只选择那些在我开始日期之前的文件;在我的开始日期和结束日期之间;就在我的结束日期之后。

你怎么会在R?我一直在想它,但我没办法做到这一点。使用list.files?但是,您如何在文件名中引入中间日期的条件?

例如,我有文件:

lineal_fit_coef_130220183448.csv

lineal_fit_coef_130223113802.csv

lineal_fit_coef_130226043153.csv

lineal_fit_coef_130306094439.csv

lineal_fit_coef_130307094011.csv

,我的开始日期为:130223193927,结束日期为130227122246

我只想选择这三个文件:

lineal_fit_coef_130223113802.csv

lineal_fit_coef_130226043153.csv

lineal_fit_coef_130306094439.csv

我希望你能以某种方式帮助我。

5 个答案:

答案 0 :(得分:1)

如何使用 dir 获取文件名列表。使用 substr 提取字符串的相应部分,使用 as.numeric 将其强制转换为数字,最后使用< 进行比较以选择文件你想用?

答案 1 :(得分:0)

我认为您正在寻找“file.info”函数

在csv文件上使用它并将您的选择应用于mtime列

files = list.files(pattern="csv$")
finfo = file.info(files)
finfo$mtime

如果你想做同样的事情但是在文件名中使用时间,首先你必须将它们转换为日期,然后你可以进行选择。

#extract the part o the filename that holds the date
chardates = gsub(x=files, pattern = ".*_.*_.*_(.*).csv", replace="\\1")
#convert it to a real R Date
dates = strptime(chardates, format="%y%m%d%H%M%S")
#perform your selection
...

答案 2 :(得分:0)

您可以编写类似下面的自定义函数

list.files.by.date <- function(from,to,...) {
  filelist <- list.files(...)
  timestamps <- as.POSIXct(gsub('.*([0-9]{12})+.*','\\1',filelist), format='%y%m%d%H%S', tz='GMT' )
  fromtime <- as.POSIXct(from,, format='%y%m%d%H%S', tz='GMT' )
  totime <- as.POSIXct(to,, format='%y%m%d%H%S', tz='GMT' )
  return(filelist[timestamps >= fromtime & timestamps <= totime])
}

这将允许您获取文件名中“timestamp”位于fromto参数定义的范围内的文件。

答案 3 :(得分:0)

您需要使用list.files(),将日期提取为字符串并转换为POSIXct。以下是如何获取日期:

fileDates <- as.POSIXct(substr(list.files(pattern="lineal_fit_coef_[0-9]*\\.csv"),17,28), format="%y%m%d%H%M%S")

然后您可以将这些与开始日期和结束日期进行比较,并将结果用作索引向量list.files()

startingDate <- as.POSIXct("130223193927", format="%y%m%d%H%M%S")
endingDate <- as.POSIXct("130227122246", format="%y%m%d%H%M%S")

list.files(pattern="lineal_fit_coef_[0-9]*\\.csv")[fileDates >= startingDate & fileDates <= endingDate]

希望这有帮助!

答案 4 :(得分:0)

试试这个(仅适用于特定情况):

files <- c('lineal_fit_coef_130220183448.csv','lineal_fit_coef_130223113802.csv','lineal_fit_coef_130226043153.csv','lineal_fit_coef_130306094439.csv','lineal_fit_coef_130307094011.csv')
filesDATE <- as.double(gsub('[^0-9]', '', files))

files[filesDATE >= 130223193927 & filesDATE <= 130227122246]

(你的例子是对的?我有不同的价值观)