首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在dataframe中插入每个日期的日期序列。

在dataframe中插入每个日期的日期序列。
EN

Stack Overflow用户
提问于 2019-10-04 19:47:37
回答 3查看 541关注 0票数 2

我有一个数据框架,它有两个列,TickerDate。对于每一个日期观察,我想创建一个日期序列,可以追溯到从最初日期到最初日期的3天前(如seq(OriginalDate, OriginalDate-3, by=1))。

例如:

代码语言:javascript
复制
df = data.frame(Ticker = c("AAPL", "MSFT"), Date = c("2019-01-05", "2019-02-10"))

print(df)

Ticker Date
AAPL   2019-01-05
MSFT   2019-02-10

我希望新的数据框架如下所示:

代码语言:javascript
复制
print(df)

Ticker Date        Date_Sequence
AAPL   2019-01-05  2019-01-05 #original Date
AAPL   2019-01-05  2019-01-04 #original Date -1
AAPL   2019-01-05  2019-01-03 #original Date -2
MSFT   2019-02-10  2019-02-10 
MSFT   2019-02-10  2019-02-09
MSFT   2019-02-10  2019-02-08
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-04 20:07:48

使用data.table

代码语言:javascript
复制
library(data.table)

setDT(df)[ , .(Date_Sequence = as.Date(Date) - 0:2), .(Ticker, Date)]

#    Ticker       Date Date_Sequence
# 1:   AAPL 2019-01-05    2019-01-05
# 2:   AAPL 2019-01-05    2019-01-04
# 3:   AAPL 2019-01-05    2019-01-03
# 4:   MSFT 2019-02-10    2019-02-10
# 5:   MSFT 2019-02-10    2019-02-09
# 6:   MSFT 2019-02-10    2019-02-08
票数 5
EN

Stack Overflow用户

发布于 2019-10-04 19:50:00

一种选择是首先将“Date”转换为Date类,uncount将按“Ticker”分组的每一行展开'n‘次数,从'Date’的first中创建一个反向日期序列。

代码语言:javascript
复制
library(dplyr)
library(tidyr)
library(purrr)
df %>% 
   mutate(Date = as.Date(Date)) %>%
   uncount(3) %>% 
   group_by(Ticker) %>% 
   mutate(Date_Sequence = seq(first(Date), length = n(), by = '-1 day'))

或者另一种选择是使用mutateunnest创建一个mutate

代码语言:javascript
复制
df %>%
  mutate(Date = as.Date(Date),
         Date_Sequence = map(Date, seq, length = 3, by = '-1 day')) %>%
  unnest_legacy(Date_Sequence)
#  Ticker       Date Date_Sequence
#1   AAPL 2019-01-05    2019-01-05
#2   AAPL 2019-01-05    2019-01-04
#3   AAPL 2019-01-05    2019-01-03
#4   MSFT 2019-02-10    2019-02-10
#5   MSFT 2019-02-10    2019-02-09
#6   MSFT 2019-02-10    2019-02-08
票数 4
EN

Stack Overflow用户

发布于 2019-10-04 20:52:59

代码语言:javascript
复制
df$Date <- as.Date(df$Date)
df <- df[rep(seq(nrow(df)), each = 3),]
df$Date_Sequence <- df$Date - 0:2

df
#     Ticker       Date Date_Sequence
# 1     AAPL 2019-01-05    2019-01-05
# 1.1   AAPL 2019-01-05    2019-01-04
# 1.2   AAPL 2019-01-05    2019-01-03
# 2     MSFT 2019-02-10    2019-02-10
# 2.1   MSFT 2019-02-10    2019-02-09
# 2.2   MSFT 2019-02-10    2019-02-08
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58242406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档