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