【问题标题】:How to select files according to datetime filename in R?如何根据 R 中的日期时间文件名选择文件?
【发布时间】:2013-04-03 01:20:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: r filenames


    【解决方案1】:

    dir获取文件名列表怎么样。使用 substr 提取字符串的适当部分,使用 as.numeric 将它们强制为数字,最后使用 进行比较以选择您想要的文件想用吗?

    【讨论】:

      【解决方案2】:

      您可以编写如下的自定义函数

      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])
      }
      

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

      【讨论】:

        【解决方案3】:

        您需要使用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】:

          我认为您正在寻找函数“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
          ...
          

          【讨论】:

          • 没有。 OP 希望通过文件名中的时间戳进行搜索。不是通过修改文件的时间戳属性
          • 虽然您回答的第一部分没有解决 OP 的问题,但我仍然想发表评论。使用file.mtime(files) 之类的东西而不是提取所有细节,然后从那里绘制会更有效(如果您只需要时间值)。
          【解决方案5】:

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

          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]
          

          (你的例子是正确的?我得到了不同的值)

          【讨论】:

            猜你喜欢
            • 2018-05-11
            • 1970-01-01
            • 2017-12-15
            • 2021-04-23
            • 1970-01-01
            • 2019-06-24
            • 2022-07-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多