【问题标题】:Change day start and end time更改一天的开始和结束时间
【发布时间】:2018-03-27 17:05:28
【问题描述】:

如何强制 R 更改一天的参数。所以我的意思是,例如这里提供的 yrDay 不是从早上 0 点到凌晨 0 点,而是从下午 6 点到下午 6 点。

df <- data.frame(Date=seq(
        from=as.POSIXct("2012-1-1 13:00:00", tz="UTC"),
        to=as.POSIXct("2012-1-3 13:00:00", tz="UTC"),
        by="hour")
)
df$yrDay <- as.numeric(strftime(df$Date,format="%j"))

【问题讨论】:

  • 这是为了快速和肮脏的目的,还是你想要一些强大的东西来对抗所有出现的诡计日期/时间(夏令时、闰秒/天、当地法律变化等)并且继续。)日期和时间是很难如果你想真正准确。但如果完美是善的敌人,只需在计算时添加相关常数即可。
  • 我需要它来进行体温的日常周期分析。我认为它不是那么强大,但希望足够。

标签: r datetime


【解决方案1】:

只需使用您的代码添加 5 小时(5 * 60 分钟 * 60 秒):

df$yrDay <- as.numeric(strftime(df$Date + 5*60*60,format="%j"))

                  Date yrDay
1  2012-01-01 13:00:00     1
2  2012-01-01 14:00:00     1
3  2012-01-01 15:00:00     1
4  2012-01-01 16:00:00     1
5  2012-01-01 17:00:00     1
6  2012-01-01 18:00:00     2
7  2012-01-01 19:00:00     2
8  2012-01-01 20:00:00     2
9  2012-01-01 21:00:00     2
10 2012-01-01 22:00:00     2
...

或使用lubridate 6 小时(更好的方法恕我直言):

df$yrDay <- lubridate::day(df$Date + 6*60*60)

但正如 @ngm 在 cmets 中所提到的,这是一种快速而肮脏的解决方案,可能并不适用于所有情况。

【讨论】:

【解决方案2】:

上述 Q 的 Python 代码中的强大解决方案。

此算法使用 NumPy 和 pandas 为您的日期时间数据中的每个时间设置条件。它只是询问前一天是否小于指定的时间,并且日期 == 到当前日期。

然后它会询问,如果后天大于轮班时间,是否会在您的数据中为每一天生成此条件,然后检查与前一天相同的日期。

希望这有助于或鼓励其他人尝试思考以获得更好的解决方案。

对不起,我的英语不是我的第一次,而且我很忙,所以这是我分配给答案的最佳时间。希望改进请提供有用的cmets并尽量不要苛刻:)

def count_custome_day_start_and_end(pd_index_datetime, shift_time='8:30am'):
    dates = sorted(set(pd_index_datetime.date))
    times = np.array([time.time() for time in pd_index_datetime
                      ])
    shift_time = pd.to_datetime(shift_time).time()
    conditiones = [
        cond for date in dates for cond in [
            ((times < shift_time)
             & (pd_index_datetime.date == date)),  # day before
            ((times >= shift_time)
             & (pd_index_datetime.date == date))   # day after
        ]
    ]
    langth = (len(conditiones) // 2) + 1
    choices = [0, *np.repeat(range(1, langth), 2)]
    choices.pop()
    return np.select(conditiones, choices, pd_index_datetime.factorize()[0])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-29
    • 2012-10-30
    • 2012-02-27
    • 1970-01-01
    • 2015-03-29
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多