在一天中的某些时段创建虚拟变量

时间:2017-06-09 21:13:45

标签: r time-series rstudio posixct dummy-variable

我需要一些帮助。我目前正在尝试将线性模型与小时电价相匹配。所以,我想创建一个假人,如果一天中的小时是在06:00到20:00之间,则取值为1。不幸的是,到目前为止我一直在努力。

time.cet <- as.POSIXct(time.numeric, origin = "1970-01-01", tz=local.time.zone)
hours.S <- strftime(time.cet, format = "%H:%M:%S", tz=local.time.zone)
head(time.cet)
[1] "2007-01-01 00:00:00 CET" "2007-01-01 01:00:00 CET" "2007-01-01 02:00:00 CET"
[4] "2007-01-01 03:00:00 CET" "2007-01-01 04:00:00 CET" "2007-01-01 05:00:00 CET"

我希望有人可以提供帮助。

4 个答案:

答案 0 :(得分:2)

当我做截止时间时,我喜欢将截止值作为对象。这样,如果您需要更改截止值,则更改对象的值而不是条件语句中的值会更容易。

我的代码使用了lubridate(),这是一个管理时间/日期的好方法。

下面的代码应该为您提供将虚拟变量合并到分析中所需的信息。

add_action( 'woocommerce_cart_calculate_fees','woocommerce_custom_surcharge', 10, 1 );
function woocommerce_custom_surcharge( $cart_object ) {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    ## ---- CALCULATION ---- ##

    global $wpdb;

    foreach( $cart_object->get_cart() as $values ){ 

        $tax_hotel = $wpdb->get_row( "SELECT * FROM tax_hotel_and_name WHERE hotel_id= '".$values['st_booking_data']['room_id']."'" );

        $sum[] = ($tax_hotel->tax_percentage / 100) * $values['st_booking_data']['total_price'];
    }

    $fee = array_sum($sum);

    ## ---- APPLYING CALCULATED FEE ---- ##

    if($fee > 0)
        $cart_object->add_fee( __('Processing Fee'), $fee, false );
}

答案 1 :(得分:1)

ifelse()语句是创建虚拟变量的便捷方式。我个人对时间的了解并不多,但创建虚拟变量的形式类似于: dummy <- with(data, ifelse(time > 06:00 & time < 20:00, 1, 0) 数据是你的数据被调用的地方,时间是存储时间的列。如果时间不像普通的数字向量那样,你可能需要稍微调整一下条件(我假设为了这个目的,他们会)。

答案 2 :(得分:1)

library(lubridate)

# Create fake data
set.seed(2)
dat = data.frame(time = seq(ymd_hms("2016-01-01 00:00:00"), ymd_hms("2016-01-31 00:00:00"), by="hour"))
dat$price = 1 + cumsum(rnorm(nrow(dat), 0, 0.01))

# Create time dummy
dat$dummy = ifelse(hour(dat$time) >=6  & hour(dat$time) <= 20, 1, 0)

答案 3 :(得分:1)

尝试下次包含可重现的代码。您似乎错过了time.numeric

好的,我不得不随意补课。

time.cet <- c( ymd_hms( "2007-01-01 00:00:00" ), 
               ymd_hms( "2007-01-01 06:00:00" ), 
               ymd_hms( "2007-01-01 12:00:00" ) )
time.cet

[1] "2006-12-31 18:00:00 CST" "2007-01-01 00:00:00 CST" "2007-01-01 06:00:00 CST"

请注意时区问题,这对解决方案而言并不重要。

您可以使用dplyr::betweenlubridate::hour获取TRUE / FALSE(或1/0)列表,以确定X时间是否在A & B之间。

library(dplyr)
library(lubridate)

A <- 6
B <- 20
between( hour(time.cet), A, B )
[1]  TRUE FALSE  TRUE

请注意,between包含>=&amp; <=