R语言:将周期型长格式时间序列转换为宽格式小时级时间序列
把事件起止数据转成小时级宽格式时间序列(无值填0)
嘿,我来帮你搞定这个转换需求!从你提供的数据结构来看,你有一批关联资产和事件时间戳的数据,想要把它转成小时级的宽格式时间序列,没有对应事件的小时就用0填充。下面用R的tidyverse+lubridate工具链来实现,步骤很清晰:
1. 先加载必备工具包
library(tidyverse) library(lubridate)
2. 预处理原始数据:拆分事件到每一小时
首先得把每个事件的起止时段拆成它覆盖的每一个小时。比如一个事件从2018-05-07 01:30:00到2018-05-07 03:15:00,我们要把它拆成01:00、02:00、03:00这三个小时的记录,标记为有事件(值为1)。
假设你的数据框叫df,先把Unix时间戳转成可读的datetime格式,再生成每个事件覆盖的小时序列:
df <- df %>% # 把Unix时间戳转成datetime格式 mutate( EventStart = as_datetime(EventStart), EventEnd = as_datetime(EventEnd) # 假设你的数据包含事件结束时间,若没有需调整逻辑 ) %>% # 按行生成每个事件覆盖的所有小时节点 rowwise() %>% mutate( hour_seq = list(seq(floor_date(EventStart, "hour"), floor_date(EventEnd, "hour"), by = "hour")) ) %>% unnest(hour_seq) %>% # 标记该小时对应资产有事件 mutate(has_event = 1) %>% select(AffectedAssetMask, hour_seq, has_event)
3. 生成完整的小时时间轴
为了保证没有事件的小时也能被包含进来,我们需要先生成整个数据集时间范围内的所有连续小时:
# 确定时间范围的首尾小时节点 min_hour <- floor_date(min(df$hour_seq), "hour") max_hour <- floor_date(max(df$hour_seq), "hour") # 生成无间断的完整小时序列 full_hour_axis <- tibble(hour_seq = seq(min_hour, max_hour, by = "hour"))
4. 合并数据并转成宽格式
现在把完整小时轴和事件数据合并,然后转成宽格式,把没有事件的小时填0:
wide_time_series <- full_hour_axis %>% # 交叉连接所有资产,确保每个小时每个资产都有一条记录 crossing(AffectedAssetMask = unique(df$AffectedAssetMask)) %>% # 左连接事件数据,无事件的记录会显示NA left_join(df, by = c("hour_seq", "AffectedAssetMask")) %>% # 把NA替换为0,代表该小时无事件 mutate(has_event = replace_na(has_event, 0)) %>% # 转成宽格式:每个资产对应一列,每行是一个小时节点 pivot_wider( names_from = AffectedAssetMask, values_from = has_event, names_prefix = "Asset_" # 可选,给列名加前缀更清晰 )
结果说明
最终的wide_time_series就是你要的格式:
- 第一列
hour_seq是每个小时的时间节点 - 后续每列对应一个资产,值为1表示该小时该资产有事件,0表示无事件
特殊情况调整
如果你的原始数据没有EventEnd字段(每个事件仅持续1小时),直接用EventStart作为hour_seq即可,跳过生成小时序列的步骤。要是你用Python实现,思路类似:用pandas的explode生成小时序列,再用pivot_table转宽格式,通过fill_value=0填充空值。
内容的提问来源于stack exchange,提问作者user9753565
相关产品推荐
相关产品推荐

