我在同一项目范围pandas dataframe groupby datetime month中还有另一个问题,但是我担心数据结构可能很复杂,因此我正在尝试另一种方法。我希望这能达到相同的结果。
理想情况下,我希望将电话号码矩阵构建为行,将开始日期和结束日期构建为列,并确定拨打电话的时间段。
这将通过将日期和电话号码的数据集转换为完整的日期列表,确定结束日期匹配,然后查看拨打电话的日期是否在该时间段内来实现。
原始数据如下:
Date = as.Date(c("2019-03-01", "2019-03-15","2019-03-29", "2019-04-10","2019-03-05","2019-03-20"))
Phone = c("070000001","070000001","070000001","070000001","070000002","070000002")
df<-data.frame(Date,Phone)
df
## Date Phone
## 1 2019-03-01 070000001
## 2 2019-03-15 070000001
## 3 2019-03-29 070000001
## 4 2019-04-10 070000001
## 5 2019-03-05 070000002
## 6 2019-03-20 070000002
理想情况下,我希望它看起来像这样:
## Date Phone INT_1 INT_2 INT_3 INT_4 INT_5
## 1 2019-03-01 070000001 X X X X X
## 2 2019-03-15 070000002 X X X
INT
是一系列日期+ 30,而X
表示该电话号码出现在该滚动期内。
为此,我假设您需要两个数据集。上面的一个是按日期拨打的电话号码,第二个是日期的完整列表及其= 30天的计数器。
dates<-as.data.frame(seq(as.Date("2016/7/1"), as.Date("2019/7/1"),"days"),
responseName = c('start'))
dates$end<-dates$start+30
## INT start end
## 1 2016-07-01 2016-07-31
## 2 2016-07-02 2016-08-01
## 3 2016-07-03 2016-08-02
## 4 2016-07-04 2016-08-03
但是我如何让两者一起评估呢?我假设某种电话数据的合并和扩展到日期列表中,然后通过行索引/ INT散布日期?
答案 0 :(得分:0)
我认为要匹配两个数据帧,可以使用fuzzyjoin。例如,如果我将电话号码和使用日期的数据框定义为:
library(dplyr)
library(fuzzyjoin)
fake_phone_data <- tibble(
date = as.Date(c("2019-01-03", "2019-01-27", "2019-02-12", "2019-02-25", "2019-02-26")),
phone = c("1", "1", "2", "2", "2")
)
和开始/结束日期的数据框(加上ID列)为:
id_dates <- tibble(
ID = c("1", "2", "3", "4"),
starting_date = as.Date(c("2019-01-01", "2019-01-16", "2019-02-01", "2019-02-16")),
ending_date = as.Date(c("2019-01-15", "2019-01-31", "2019-02-15", "2019-02-27"))
)
然后我可以使用Fuzzyjoin连接两个数据帧,即,如果电话的日期发生在相应时段的开始日期和结束日期之间,则匹配两行:
fuzzy_left_join(
fake_phone_data,
id_dates,
by = c(
"date" = "starting_date",
"date" = "ending_date"
),
match_fun = list(`>=`, `<`)
)
#> # A tibble: 5 x 5
#> date phone ID starting_date ending_date
#> <date> <chr> <chr> <date> <date>
#> 1 2019-01-03 1 1 2019-01-01 2019-01-15
#> 2 2019-01-27 1 2 2019-01-16 2019-01-31
#> 3 2019-02-12 2 3 2019-02-01 2019-02-15
#> 4 2019-02-25 2 4 2019-02-16 2019-02-27
#> 5 2019-02-26 2 4 2019-02-16 2019-02-27
由reprex package(v0.3.0)于2019-07-19创建
它可以解决您的问题吗?
此方法与this question非常相似。