在 中R
,我可以使用以下方法将日期解析为 Lubridate 格式:
d <- ymd("2013-02-15")
Run Code Online (Sandbox Code Playgroud)
我如何以yyyyMMdd
格式输出它,例如:
20130215
Run Code Online (Sandbox Code Playgroud)
等效的 .NET 命令是:
.ToString("yyyyMMdd")
Run Code Online (Sandbox Code Playgroud)
我知道这个问题的答案很简单,但我花了最后一个小时试图找到任何有关使用 Lubridate 输出日期的参考,但到目前为止尚未成功。
我正在为以下示例而苦苦挣扎
time = c('2013-01-03 21:59:21.549', '2013-01-04 22:00:21.549', '2013-01-05 22:01:21.222', '2013-01-06 22:06:23.559' )
value = c(1,2,3,4)
data <- data_frame(time, value)
data <-data %>% mutate(time = ymd_hms(time))
> data
# A tibble: 4 × 2
time value
<dttm> <dbl>
1 2013-01-03 21:59:21 1
2 2013-01-04 22:00:21 2
3 2013-01-05 22:01:21 3
4 2013-01-06 22:06:23 4
Run Code Online (Sandbox Code Playgroud)
我怎样才能写出一份dplyr::filter
声明,而不是每天只保留21:59
和22:01
(包括)之间的观察结果?
与hour(time)
和分开玩minute(time)
在这里似乎不太好。
我在这里错过了什么吗?
预期输出:仅第 1,2 和 3 行。谢谢!
考虑以下事项:
library(lubridate)
period1 = weeks(2)
as.numeric(period1, "weeks")
> 2 # as expected
Run Code Online (Sandbox Code Playgroud)
现在我试图用几个月做类似的事情:
period2= months(6)
as.numeric(period2, "months")
as.numeric(period2, "weeks")
> 26.08929 # OK
as.numeric(period2,"months")
> 0.04166667 # Not OK?
Run Code Online (Sandbox Code Playgroud)
这是一个错误lubridate
吗?或者我做错了什么/错过了什么?
注意:我看过(旧)评论Have lubridate减法只返回一个数值,所以我想我也可以使用解决方法来使用,difftime
但我想坚持使用lubridate。
我Rstudio
参加我的R
会议,我有以下R
代码:
d1 <- read.csv("mydata.csv", stringsAsFactors = FALSE, header = TRUE)
d2 <- d1 %>%
mutate(PickUpDate = ymd(PickUpDate))
str(d2$PickUpDate)
Run Code Online (Sandbox Code Playgroud)
上面最后一行代码的输出如下:
Date[1:14258], format: "2016-10-21" "2016-07-15" "2016-07-01" "2016-07-01" "2016-07-01" "2016-07-01" ...
Run Code Online (Sandbox Code Playgroud)
我需要在 中添加一个附加列(我们称之为MthDD
)dataframe
d2
,这将是“ ”列的月份和日期PickUpDate
。因此,列MthDD
需要采用格式mm-dd
,但最重要的是,它仍然应该是date type
.
我怎样才能实现这个目标?
更新:我已尝试以下操作,但它将新列输出为字符类型。我需要该列为日期类型,以便我可以将其用作绘图的 x 轴组件。
d2$MthDD <- format(as.Date(d2$PickUpDate), "%m-%d")
Run Code Online (Sandbox Code Playgroud) 首先让我们创建一些示例数据。时间使用lubridate
's存储,hm
因为这似乎最合适。
library(tibble)
library(lubridate)
#>
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#>
#> date
(
data <- tibble(
Time = hm('09:00', '10:30'),
Value = 1
)
)
#> # A tibble: 2 x 2
#> Time Value
#> <S4: Period> <dbl>
#> 1 9H 0M 0S 1
#> 2 10H 30M 0S 1
Run Code Online (Sandbox Code Playgroud)
这是我希望情节的样子。现在,我已经以半小时为间隔手动指定了休息时间。
library(ggplot2)
library(scales)
ggplot(data, aes(Time, Value)) +
geom_point() +
scale_x_time(breaks = hm('09:00', '09:30', '10:00', '10:30'))
Run Code Online (Sandbox Code Playgroud)
我想每隔半小时自动创建这些休息时间。尝试使用scales::date_breaks …
我正在尝试使用 lubridate 包创建日期时间,并且我尝试了以下值:
library(lubridate)
ymd_hms("2017-07-02 23:00:00")
[1] "2017-07-02 23:00:00 UTC"
ymd_hms("2017-07-02 00:00:00")
[1] "2017-07-02 UTC"
Run Code Online (Sandbox Code Playgroud)
看起来,如果您输入午夜时间 00:00:00,ymd_hms() 方法会忽略时间值,结果会变成日期。有什么办法可以在结果中显示 00:00:00 吗?多谢!
我在时间转换中遗漏了什么吗?非常简单的例子:
library(lubridate)
time <- "2019-01-14 10:58:23.438000"
op <- options(digits.secs=6)
ymd_hms(time, tz = "Europe/Helsinki")
[1] "2019-01-14 10:58:23.437 EET"
ymd_hms(time)
[1] "2019-01-14 10:58:23.437 UTC"
Run Code Online (Sandbox Code Playgroud)
为什么这里的毫秒数是一秒?似乎不是四舍五入的问题?
虽然这似乎有效:
time <- "2019-01-14 10:58:23.123456"
op <- options(digits.secs=6)
ymd_hms(time)
[1] "2019-01-14 10:58:23.123456 UTC"
Run Code Online (Sandbox Code Playgroud)
会话信息
sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
Matrix products: default
locale:
[1] LC_COLLATE=Finnish_Finland.1252 LC_CTYPE=Finnish_Finland.1252 LC_MONETARY=Finnish_Finland.1252 LC_NUMERIC=C
[5] LC_TIME=Finnish_Finland.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] lubridate_1.7.4 …
Run Code Online (Sandbox Code Playgroud) 我需要使用日期时间列获取数据集的确切季节(秋季、冬季、春季和夏季)"POSIXct" "POSIXt"
。
重要的是要考虑到季节取决于地球上的春分和至日,而且季节发生的确切时间会随着时间的推移以及纬度和经度位置而变化。因此,这并不像为所有年份的所有春分和至日定义相同的日期和时间那么简单。
下面的表格显示了多年来的这种变化:http://www.astropixels.com/ephemeris/soleq2001.html。
R 包中有没有内置函数可以实现这一点?
下面是一个起点:
# Load packages
library(lubridate)
library(dplyr)
# Create dummy df with datetime col
df <- data.frame(datetimes = seq(as.POSIXct("2016-01-01 00:00:00", tz = "UTC"),
as.POSIXct("2019-12-31 23:59:59", tz="UTC"),
by = "hour"))
# Calculate season in a fix position given by lon, lat pairs
df2 <-
df %>%
mutate(season = datetimeToExactSeason(datetimes))
Run Code Online (Sandbox Code Playgroud) 我有一个包含很多位置(大约 30.000 个)的数据框,我需要将每个位置的时间转换为当地时间。\n我尝试了一些想法,例如这个和这个。但他们不适合我。
\n\n我有这样的数据:
\n\ndt = data.table(date = c("2018-01-16 22:02:37",\n "2018-01-16 22:54:00", \n "2018-01-16 23:08:38"),\n lat = c(-54.5010,\n -54.5246,\n -54.5285),\n long = c(-25.0433, \n -25.0929,\n -25.0832))\n
Run Code Online (Sandbox Code Playgroud)\n\n我期望这个输出:
\n\ndate lat long\n2018-01-16 20:02:37 -54.5010 -25.0433\n2018-01-16 20:54:00 -54.5246 -25.0929\n2018-01-16 21:08:38 -54.5285 -25.0832\n
Run Code Online (Sandbox Code Playgroud)\n\n一试:
\n\nlibrary(sf)\ndt = data.table(date = c("2018-01-16 22:02:37",\n "2018-01-16 22:54:00", \n "2018-01-16 23:08:38"),\n lat = c(-54.5010,\n -54.5246,\n -54.5285),\n long = c(-25.0433, \n -25.0929,\n -25.0832))\n\nsdf = st_as_sf(dt, coords = c("long", "lat"), crs = …
Run Code Online (Sandbox Code Playgroud) 我曾经使用packagecombn()
来查找两个日期/时间之间的重叠。但处理我正在处理的大型数据集太慢了。我正在尝试从包中使用,但无法让它工作。任何帮助,将不胜感激。如果您知道我应该查看的任何其他包/功能,也请告诉我。lubridate
combn()
comboGeneral()
RcppAlgos
get_overlap <- function(.data, .id, .start, .end) {
id <- .data[[.id]]
int <- interval(.data[[.start]], .data[[.end]])
names <- combn(id, 2, FUN = function(.) paste(., collapse = "-"))
setNames(combn(int, 2, function(.) intersect(.[1], .[2])), names)
}
get_overlap(dat, "id", "start", "end")
# a-b a-c a-d a-e b-c b-d b-e c-d c-e d-e
# 49 1 4 17 23 14 18 NA 2 NA
Run Code Online (Sandbox Code Playgroud)
这是我使用失败的尝试comboGeneral()
。
comboGeneral(dat$int, 2, FUN = function(.) intersect(.[1], .[2]))
# Output: …
Run Code Online (Sandbox Code Playgroud)