【问题标题】:R - How to choose files by dates in file names?R - 如何按文件名中的日期选择文件?
【发布时间】:2018-05-11 07:21:58
【问题描述】:

很难为我的问题找到一个标题,因为它非常具体。

我的问题是:我在不同时期收集了大约 9000 个数据文件。文件名包含这些句点,我只想将这些文件加载​​到 R 中,其中包含至少 17/18 年的数据收集。

我创建了一个测试列表来说明我的意思:

list = c("AT0ACH10000700100dymax.1-1-1993.31-12-2003",
         "AT0ILL10000700500dymax.1-1-1990.31-12-2011", 
         "AT0PIL10000700500dymax.1-1-1992.31-12-2011",
         "AT0SON10000700100dymax.1-1-1990.31-12-2011",
         "AT0STO10000700100dymax.1-1-1992.31-12-2006",  
         "AT0VOR10000700500dymax.1-1-1991.31-12-2011",
         "AT110020000700100dymax.1-1-1993.31-12-2008",
         "AT2HE190000700100dymax.1-1-1993.31-12-2000", 
         "AT2KA110000700500dymax.1-1-1991.31-12-2010", 
         "AT2KA410000700500dymax.1-1-1991.31-12-2011")

这些是文件名。现在我想提取所有包含至少 18 年的测量值的文件名。例如第一个文件因为句号太短应该取出,第二个很好。所以我必须创建一些比较日期(只有年份)或类似 startyear + 18 的东西。

哦,文件名的长度不一样!这只是一个例子。

我不知道该怎么做。有人可以帮忙吗?

【问题讨论】:

  • 文件是否总是以d-m-Y.d-m-Y 结尾?
  • 是的,没错,他们做到了!

标签: r regex date extract filenames


【解决方案1】:

假设日期总是用“.”分隔,您可以使用字符串拆分。这是一个以天为单位获取时差的示例。

split_list = strsplit(list, split=".", fixed=TRUE)

from = unlist(lapply(split_list, "[[", 2))
to = unlist(lapply(split_list, "[[", 3))
from = as.POSIXct(from, format="%d-%m-%Y")
to = as.POSIXct(to, format="%d-%m-%Y")

difftime(to, from, "days")

要获得以年为单位的时差,您可以使用几种不同的解决方案。这里有两个解决方案:

R: How to calculate the difference in years between a date and a year

R get date difference in years (floating point)

【讨论】:

  • 谢谢!当我正确理解它时,我会得到一个包含天数差异的列表。我可以使用索引列表并将其应用于我的原始列表以获取正确的文件。对吗?
  • 是的,完全正确。例如,如果您希望差异超过 6575 天(~18 年 * 365.25 天/年),您可以找到符合条件的索引:idx = difftime(to, from, "days") > 6575。然后子集列表:list[idx]
  • 谢谢!我得到了它! :))
【解决方案2】:

带有一些假设的替代解决方案,但可以干净地获得所需的输出。

year_to   <- as.integer(sub(".*([0-9]{4}$)",      "\\1", list))
year_from <- as.integer(sub(".*-([0-9]{4})\\..*", "\\1", list))

# Assume all "from" dates start on Jan 01 and "to" dates end Dec 31
# Then the difference is 
diff <- year_to - year_from + 1
diff >= 18
FALSE  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 2021-02-25
    • 2019-02-28
    • 1970-01-01
    相关资源
    最近更新 更多