我试图将dataframe中的两个列转换为“好”的日期和时间类,直到现在还没有取得多大成功。我尝试了各种类(timeDate
,Date
,timeSeries
,POSIXct
,POSIXlt
),但没有成功。也许我只是忽略了明显的,因为我已经尝试了这么多的方法,我只是不知道什么是什么了。我希望你们中的一些人能对我的错误之处有所启发。
目标:我想用最早和最晚的日期计算两个日期之间的差值。我使用head()
和tail()
得到了这个值,但是因为这些值不一定是数据中的最早和最晚日期,所以我需要另一种方法。(我无法让数据排序工作,因为它只在日期当天对数据进行排序。)
第二目标:我想转换日期从每日格式(i.即8-12-2010)到每周、每月和每年的水平(即8-12-2010)。即‘49- 2010’、‘December-10’和仅仅‘2010’)。这可以通过格式设置(如%d-%m-%y
)来完成。这可以通过转换数据来完成。帧转换为时间类,然后将时间类转换为正确的格式((8-12-2010 -> format("%B-%y") -> 'december-10'
),然后将该时间类转换为每个月的水平因子?
对于这两个目标,我需要以某种方式将日期框转换为时间类,这就是我遇到一些困难的地方。
我的dataframe看起来像这样:
> 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
以下是我所尝试的内容的摘要:
> 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"
TimeDate包有一个“range”函数,但是,转换为Date类适用于单个示例,但由于某种原因不适用于 Dataframe :
> as.Date(tmpTimes4[1,1], format="%d-%m-%y")
[1] "2007-03-01"
> as.Date(tmpTimes4, format="%d-%m-%y")
Error in as.Date.default(tmpTimes4, format = "%d-%m-%y") :
do not know how to convert 'tmpTimes4' to class "Date"
在这一点上,我几乎相信这是不可能做到的,所以任何想法都将受到高度赞赏!
致上,
4条答案
按热度按时间eagi6jfj1#
从一些虚拟数据开始:
所以我们有这样的东西:
使用上述内容,查看目标1,计算最早日期和最晚日期之间的差异。您可以将日期视为数字(这就是它们在内部存储的方式),因此像
min()
和max()
这样的函数将起作用。可以使用difftime()
函数:或使用标准减法
来计算天数的差异。
head()
和tail()
只有在对日期进行排序时才有效,因为它们采用向量中的第一个和最后一个值,而不是最高和最低的实际值。**目标2:**您似乎正在尝试将数据框转换为日期。你不能这么做您可以做的是重新格式化数据框的 * 组件 * 中的数据。在这里,我通过将
EntryTime
列重新格式化为几个不同的日期摘要来向tmpTimes
添加列。给予:
如果您是美国人或希望使用美国惯例开始一周(
%W
在星期一开始一周,在美国惯例是在星期日开始),请将%W
更改为%U
。?strftime
有更多关于%W
和%U
代表什么的细节。**关于数据格式的最后一点:**在上面的文章中,我使用了标准R格式的日期。您将数据存储在非标准标记的数据框中,可能是作为字符或因子。所以你有这样的东西:
你需要将这些字符或因子转换成R理解为日期的东西。我的首选是
"Date"
类。在使用数据尝试上述答案之前,请将数据转换为正确的格式:所以你的数据看起来像这样:
tjrkku2a2#
简短回答:
mccptt673#
以下是
tidyverse
解决方案:创建于2023-05-01使用reprex v2.0.2
n9vozmp44#
更简单。在日期列上使用
summary()
直接给出Min和Max等。示例:summary(df$date)