在 Rcpp 中查找两个给定日期之间的天数

Find number of days between two given dates in Rcpp

我是 Rcpp 的新手,但我有一个与日期和日期时间相关的任务。 让我的 Rcpp 函数中的 DataFrame 中有市场数据。因此,日期字段的格式如下:

2016-04-19 00:01:00

包含日期值的数据框字段名称是 "Date"。所以,我得到 2 个向量:

DatetimeVector datetime = df["Date"];
DateVector pureDate = df["Date"];

问题:

1) 我无法区分 Date 的 2 个 Date 值(我不知道为什么,但 gcc-4.9.3 给我这样的差异错误:

Date pureDay = pureDate[0];
auto tmp = pureDate[j+1] - pureDay;

error: ambiguous overload for 'operator-' (operand types are 'Rcpp::traits::storage_type<14>::type {aka double}' and 'Rcpp::Date') auto tmp = tmpDate[j+1] - tmpTradeDay;

但是如果我使用这样的代码:

Date pureDay = pureDate[0];
auto tmp = pureDate[j+1] - pureDate[j];

效果很好。

2) 如何格式化 DateDatetime 对象的输出? to_string 不会很好地格式化 - 我给出这样的结果:1461176460.000000

3) 我预计像 Date(datetime[i]) 这样的语法会给我一个 Date 对象。但它不会。我知道 pureDate[1] - pureDate[0] 应该具有相同的 Y-M-D 值,但它们在系列滞后(60 秒)方面有所不同。

谢谢。谁能帮我解决这些问题?

你似乎有点迷茫,这一题真的有很多问题。

问题 1) 下面将给出一个简短的例子。

问题 2) 主要是关于格式化的,您可能需要查看 class 文档和 header; DateDatetime 都有一个 format() 方法,就像用于日期(时间)格式化的 R 等价物或 C 库函数一样工作,即传说中的 strftime().

问题3)不清楚;我不确定你在问什么。也许下面问题 1) 的答案有帮助。

问题 1 的简单示例:

#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
double question1(DateVector dv) {
    double d = dv[1] - dv[0];
    return d;
}

/*** R
set.seed(123)
datevector <- Sys.Date() + cumsum(runif(3)*30);
datevector
diff(datevector)
question1(datevector)
*/

及其结果:

R> Rcpp::sourceCpp("/tmp/datequestion.cpp")

R> set.seed(123)

R> datevector <- Sys.Date() + cumsum(runif(3)*30);

R> datevector
[1] "2018-03-28" "2018-04-21" "2018-05-03"

R> diff(datevector)
Time differences in days
[1] 23.6492 12.2693

R> question1(datevector)
[1] 23.6492
R> 

与 R 的答案相同。您的代码仍然有一个索引计算,有时会使编译器感到困惑。使其更简单(即更多步骤)通常会有所帮助。

最后,也许可以看看一些 Rcpp 文档和示例。 RcppExamples 包有一个关于日期和日期时间的函数...