Datetime 如何找到最高(最近)和最低(最早)日期[R]

Datetime 如何找到最高(最近)和最低(最早)日期[R],datetime,r,time,Datetime,R,Time,我正试图将我的dataframe中的两列转换为“good”日期和时间类,但到目前为止还没有成功。我尝试过各种类(timeDate,Date,timeSeries,POSIXct,POSIXlt),但都没有成功。也许我只是忽略了显而易见的东西,因为我尝试了很多方法,我只是不知道什么是什么。我希望你们中的一些人能说明我的错误 目标: 我想用最早和最晚的日期来计算两个日期之间的差异。我使用head()和tail()得到了这个值,但是因为这些值不是我数据中最早和最晚日期所必需的,所以我需要另一种方法。(

我正试图将我的dataframe中的两列转换为“good”日期和时间类,但到目前为止还没有成功。我尝试过各种类(
timeDate
Date
timeSeries
POSIXct
POSIXlt
),但都没有成功。也许我只是忽略了显而易见的东西,因为我尝试了很多方法,我只是不知道什么是什么。我希望你们中的一些人能说明我的错误

目标: 我想用最早和最晚的日期来计算两个日期之间的差异。我使用
head()
tail()
得到了这个值,但是因为这些值不是我数据中最早和最晚日期所必需的,所以我需要另一种方法。(我无法对数据进行排序,因为它只在日期当天对数据进行排序。)

第二个目标:我想将日期从每日格式(即2010年8月12日)转换为每周、每月和每年级别(即“49-2010”、“12月10日”和“2010”)。这可以通过格式设置来完成(如
%d-%m-%y
)。这可以通过将data.frame转换为时间类,然后将时间类转换为正确的格式
(8-12-2010->格式(“%B-%y”)->“12月10日”
),然后将该时间类转换为每个月的水平因子来实现吗

对于这两个目标,我需要以某种方式将日期框转换为时间类,这就是我遇到一些困难的地方

我的数据框如下所示:

> tradesList[c(1,10,11,20),14:15] -> tmpTimes4
> tmpTimes4
   EntryTime ExitTime
1   01-03-07 10-04-07
10  29-10-07 02-11-07
11  13-04-07 14-05-07
20  18-12-07 20-02-08
> head(tmpTimes)
    EntryTime   ExitTime
8  2010-01-14 2010-03-16
9  2010-01-05 2010-01-17
7  2010-01-10 2010-01-30
3  2010-01-08 2010-04-16
10 2010-01-01 2010-01-26
13 2010-01-12 2010-02-15
> head(tmpTimes3)
    EntryTime   ExitTime
8  2010-01-14 2010-03-16
9  2010-01-05 2010-01-17
7  2010-01-10 2010-01-30
3  2010-01-08 2010-04-16
10 2010-01-01 2010-01-26
13 2010-01-12 2010-02-15
> str(tmpTimes3)
'data.frame':   15 obs. of  2 variables:
 $ EntryTime:Class 'Date'  num [1:15] 14623 14614 14619 14617 14610 ...
 $ ExitTime :Class 'Date'  num [1:15] 14684 14626 14639 14715 14635 ...
以下是我所做尝试的总结:

> class(tmpTimes4)
[1] "data.frame"
> as.Date(head(tmpTimes4$EntryTimes, n=1), format="%d-%m-%y")
Error in as.Date.default(head(tmpTimes4$EntryTimes, n = 1), format = "%d-%m-%y") : 
  do not know how to convert 'head(tmpTimes4$EntryTimes, n = 1)' to class "Date"
> as.timeDate(tmpTimes4, format="%d-%m-%y")
Error in as.timeDate(tmpTimes4, format = "%d-%m-%y") : 
  unused argument(s) (format = "%d-%m-%y")
> timeSeries(tmpTimes4, format="%d-%m-%y")
Error in midnightStandard2(charvec, format) : 
  'charvec' has non-NA entries of different number of characters
> tmpEntryTimes4 <- timeSeries(tmpTimes4$EntryTime, format="%d-%m-%y")
> tmpExitTimes4 <- timeSeries(tmpTimes4$ExitTime, format="%d-%m-%y")
> tmpTimes5 <- cbind(tmpEntryTimes4,tmpExitTimes4)
> colnames(tmpTimes5) <- c("Entry","Exit")
> tmpTimes5
     Entry    Exit    
[1,] 01-03-07 10-04-07
[2,] 29-10-07 02-11-07
[3,] 13-04-07 14-05-07
[4,] 18-12-07 20-02-08
> class(tmpTimes5)
[1] "timeSeries"
attr(,"package")
[1] "timeSeries"
> as.timeDate(tmpTimes5, format="%d-%m-%y")
Error in as.timeDate(tmpTimes5, format = "%d-%m-%y") : 
  unused argument(s) (format = "%d-%m-%y")
> as.Date(tmpTimes5, format="%d-%m-%y")
Error in as.Date.default(tmpTimes5, format = "%d-%m-%y") : 
  do not know how to convert 'tmpTimes5' to class "Date"
> format.POSIXlt(tmpTimes5, format="%d-%m-%y", usetz=FALSE)
Error in format.POSIXlt(tmpTimes5, format = "%d-%m-%y", usetz = FALSE) : 
  wrong class
> as.POSIXlt(tmpTimes5, format="%d-%m-%y", usetz=FALSE)
Error in as.POSIXlt.default(tmpTimes5, format = "%d-%m-%y", usetz = FALSE) : 
  do not know how to convert 'tmpTimes5' to class "POSIXlt"
> as.POSIXct(tmpTimes5, format="%d-%m-%y", usetz=FALSE)
Error in as.POSIXlt.default(x, tz, ...) : 
  do not know how to convert 'x' to class "POSIXlt"
在这一点上,我几乎认为这是不可能做到的,所以任何想法都将受到高度赞赏


关于,请从一些虚拟数据开始:

start <- as.Date("2010/01/01")
end <- as.Date("2010/12/31")
set.seed(1)
datewant <- seq(start, end, by = "days")[sample(15)]
tmpTimes <- data.frame(EntryTime = datewant, 
                       ExitTime = datewant + sample(100, 15))
## reorder on EntryTime so in random order
tmpTimes <- tmpTimes[sample(NROW(tmpTimes)), ]
head(tmpTimes)
使用上述方法,查看目标1,计算最早日期和最晚日期之间的差异。您可以将日期视为数字(这就是它们在内部存储的方式),因此像
min()
max()
这样的函数将起作用。您可以使用
difftime()
函数:

> with(tmpTimes, difftime(max(EntryTime), min(EntryTime)))
Time difference of 14 days
或者使用标准减法

> with(tmpTimes, max(EntryTime) - min(EntryTime))
Time difference of 14 days
在几天内得到差异
head()
tail()
仅在对日期进行排序时有效,因为这些日期采用向量中的第一个和最后一个值,而不是最高和最低的实际值

目标2:您似乎正在尝试将数据帧转换为日期。你不能这样做。您可以做的是重新格式化数据帧组件中的数据。在这里,我通过将
EntryTime
列重新格式化为几个不同的日期摘要,将列添加到
tmpTimes

tmpTimes2 <- within(tmpTimes, weekOfYear <- format(EntryTime, format = "%W-%Y"))
tmpTimes2 <- within(tmpTimes2, monthYear <- format(EntryTime, format = "%B-%Y"))
tmpTimes2 <- within(tmpTimes2, Year <- format(EntryTime, format = "%Y"))
如果您是美国人或希望在一周开始时使用美国惯例(
%W
在周一开始一周,在美国惯例是在周日开始),请将
%W
更改为
%U
<代码>?strftime提供了有关
%W
%U
所代表内容的更多详细信息


关于数据格式的最后一点:在上面,我使用了标准R格式的日期。您将数据存储在数据框中的非标准标记中,可能是字符或因子。所以你有这样的想法:

tmpTimes3 <- within(tmpTimes, 
                    EntryTime <- format(EntryTime, format = "%d-%m-%y"))
tmpTimes3 <- within(tmpTimes3, 
                    ExitTime <- format(ExitTime, format = "%d-%m-%y"))

> head(tmpTimes3)
   EntryTime ExitTime
8   14-01-10 16-03-10
9   05-01-10 17-01-10
7   10-01-10 30-01-10
3   08-01-10 16-04-10
10  01-01-10 26-01-10
13  12-01-10 15-02-10
因此,您的数据如下所示:

> tradesList[c(1,10,11,20),14:15] -> tmpTimes4
> tmpTimes4
   EntryTime ExitTime
1   01-03-07 10-04-07
10  29-10-07 02-11-07
11  13-04-07 14-05-07
20  18-12-07 20-02-08
> head(tmpTimes)
    EntryTime   ExitTime
8  2010-01-14 2010-03-16
9  2010-01-05 2010-01-17
7  2010-01-10 2010-01-30
3  2010-01-08 2010-04-16
10 2010-01-01 2010-01-26
13 2010-01-12 2010-02-15
> head(tmpTimes3)
    EntryTime   ExitTime
8  2010-01-14 2010-03-16
9  2010-01-05 2010-01-17
7  2010-01-10 2010-01-30
3  2010-01-08 2010-04-16
10 2010-01-01 2010-01-26
13 2010-01-12 2010-02-15
> str(tmpTimes3)
'data.frame':   15 obs. of  2 variables:
 $ EntryTime:Class 'Date'  num [1:15] 14623 14614 14619 14617 14610 ...
 $ ExitTime :Class 'Date'  num [1:15] 14684 14626 14639 14715 14635 ...
简短答复:

  • 如果尚未转换为日期,则转换为日期
  • 然后在列表中使用最小值和最大值 日期

    date_list = structure(c(15401, 15405, 15405), class = "Date")
    date_list
    #[1] "2012-03-02" "2012-03-06" "2012-03-06"
    
    min(date_list)
    #[1] "2012-03-02"
    max(date_list)
    #[1] "2012-03-06"
    

    • 更简单。使用日期列上的
      summary()
      直接给出最小值和最大值以及更多值。示例:
      summary(df$date)

      您可以使用
      dput(tmpTimes4)
      在代码中提供确切的数据集使用情况。@Marek:谢谢您的回复!我不知道dput,所以谢谢你的提示。:)哇,加文,非常感谢!您真的帮助了我,不仅在代码示例方面,而且在优秀(清晰)的文本方面。再次感谢,我现在完全明白了,我刚刚成功地计算了天数,转换了日期,并显示了每个时间段的结果。是的!:)@Jura25:很高兴你发现它很有用。的确,min和max适用于date,但是如果你的date列中有NA,请使用NA.rm=TRUE,例如。stardate@PanchoMulongeni日期变量中出现
      NA
      的唯一原因是无效日期(即格式不正确或不存在的日期)。我认为忽略这一点不是一件好事,你应该调查一下
      NA
      s存在的原因。如果他们在那里是因为你没有记录日期,也把他们扔掉;“如果你不知道日期,这些数据就没用了。”@GavinSimpson。回答得很好。在“>中有小的输入错误,时间差为14天(tmpTimes、difftime(max(EntryTime)、main(EntryTime))“think should be min()not main()”?这看起来更像是一个注释而不是一个答案