子集两个日期之间的数据帧

时间:2014-05-13 03:32:15

标签: r date subset

我正在处理自1993年以来巴西指数(IBOV)的每日回报,我试图找出两个日期之间的子集的最佳方法。

数据框(IBOV_RET)如下:

head(IBOV_RET)
        DATE    1D_RETURN
1 1993-04-28 -0.008163265
2 1993-04-29 -0.024691358
3 1993-04-30  0.016877637
4 1993-05-03  0.000000000
5 1993-05-04  0.033195021
6 1993-05-05 -0.012048193
...

我将2个变量DATE1DATE2设为日期

DATE1 <- as.Date("2014-04-01")
DATE2 <- as.Date("2014-05-05")

我能够使用以下代码创建新的子集:

TEST <- IBOV_RET[IBOV_RET$DATE >= DATE1 & IBOV_RET$DATE <= DATE2,]

它有效,但我想知道是否有更好的方法可以在2个日期之间对数据进行子集化,可能使用subset

7 个答案:

答案 0 :(得分:18)

正如@MrFlick已经指出的那样,你不会绕过子集化的基本逻辑。使您更容易对特定data.frame进行子集化的一种方法是定义一个函数,该函数在您的示例中接受两个输入,如DATE1DATE2,然后返回{{1}的子集根据那些子集参数。

IBOV_RET

您也可以直接在myfunc <- function(x,y){IBOV_RET[IBOV_RET$DATE >= x & IBOV_RET$DATE <= y,]} DATE1 <- as.Date("1993-04-29") DATE2 <- as.Date("1993-05-04") Test <- myfunc(DATE1,DATE2) #> Test # DATE X1D_RETURN #2 1993-04-29 -0.02469136 #3 1993-04-30 0.01687764 #4 1993-05-03 0.00000000 #5 1993-05-04 0.03319502 输入具体日期:

myfunc

答案 1 :(得分:8)

您可以将subset()功能与&运算符一起使用:

subset(IBOV_RET, DATE1> XXXX-XX-XX & DATE2 < XXXX-XX-XX)

更新更多&#34; tidyverse-oriented&#34;的方法:

IBOV_RET %>%
  filter(DATE1 > XXXX-XX-XX, DATE2 < XXXX-XX-XX) #comma same as &

答案 2 :(得分:4)

没有其他方法可以提取日期范围。逻辑与提取一系列数值相同,您只需要完成显式的日期转换。与使用subsetwith的任何其他子集化任务一样,您可以缩短子集。您可以使用cut将范围分成间隔(有一个特定的cut.Date重载)。但是基数R没有任何方法来指定日期文字,因此您无法避免转换。我无法想象你可能想到的其他类型的语法。

答案 3 :(得分:2)

怎么样:

DATE1 <- as.Date("1993-04-29")
DATE2 <- as.Date("1993-05-04")

# creating a data range with the start and end date:
dates <- seq(DATE1, DATE2, by="days")

IBOV_RET <- subset(IBOV_RET, DATE %in% dates)

答案 4 :(得分:1)

我喜欢// // Sample License App for COMP394 // // Import statements import java.util.Scanner; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import javax.net.ssl.HttpsURLConnection; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.net.URLConnection; import java.io.InputStream; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import javax.xml.xpath.*; import org.xml.sax.InputSource; import javax.xml.transform.*; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.dom.DOMSource; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathFactory; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; class LicenseApp { public static void main(String[] args) { LicenseApp http = new LicenseApp(); System.out.println("Key Verifyication!!!"); http.sendkey(); //while( http.validation2() == false) //{ //System.out.println("Key is wrong"); //} //System.out.println("Confgrats, the key is good!!! \nContinue with your program!!!"); } private boolean sendkey() { Scanner user_input = new Scanner(System.in); String key; System.out.println("Please enter your key."); // Outputs the prompt for information key = user_input.next( ); boolean valid = false; DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); try { String urlString = "http://localhost/license_response.php?response=activate&license=" + key; URL url = new URL(urlString); URLConnection conn = url.openConnection(); DocumentBuilderFactory factory2 = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory2.newDocumentBuilder(); Document doc = builder.parse(conn.getInputStream()); // doc.getDocumentElement().normalize(); TransformerFactory factory3 = TransformerFactory.newInstance(); Transformer xform = factory3.newTransformer(); //xform.transform(new DOMSource(doc), new StreamResult(System.out)); // Outputs to screen DOMSource source = new DOMSource(doc); StreamResult output = new StreamResult(new File("C:\\school\\COMP394\\Project\\Java.Program\\license.xml")); xform.transform(source, output); // Saves to file } catch(Exception e) { } return valid; // Return boolean value } }包裹 所以,如果你

dplyr

然后,就像你做的那样:

>library("dplyr")

最后

>Date1<-as.Date("2014-04-01")  
>Date2<-as.Date("2014-05-05")

答案 5 :(得分:0)

我相信lubridate在这里可以有所帮助;

daterange <- interval(DATE1, DATE2)
TEST <- IBOV_RET[which(Date %within% daterange),]

答案 6 :(得分:0)

您可以在简单地将字符串转换为日期后使用 R 的 between() 函数:

df %>%
    filter(between(date_column, as.Date("string-date-lower-bound"), as.Date("string-date-upper-bound")))