我使用以下python代码创建了一个数据框。
import pandas as pd
import datetime as dt
d = {'StartDate': pd.Series(["2018-11-01", "2018-11-04", "2018-11-06"]),
'EndDate': pd.Series(["2018-11-03", "2018-11-05", "2018-11-10"])}
df = pd.DataFrame(d)
df['StartDate'] = pd.to_datetime(df['StartDate'])
df['EndDate'] = pd.to_datetime(df['EndDate'])
我希望有一个列作为Date,它将具有介于startdate和enddate列值之间的日期。
预期输出:-
我确实在R中尝试了同样的事情。
R Script:-
df1 %>%
rowwise() %>%
do(data.frame(.[1:2], date = seq(.$min_date, .$max_date, by = "1 day")))
有人可以建议我吗?
答案 0 :(得分:1)
date_range
+ merge
您可以使用pd.date_range
创建日期范围,并将两个数据框设置合并为合并类型的outer
。最后,您可以使用fillna()
中的ffill
方法来填充缺失的值,该方法会将最后一个有效的观察结果向前传播到下一个有效的回填。
print(df)
StartDate EndDate
0 2018-11-01 2018-11-03
1 2018-11-04 2018-11-05
2 2018-11-06 2018-11-10
dates = pd.DataFrame(pd.date_range(start=df.min().StartDate,
end=df.max().EndDate), columns=['Date'])
pd.merge(left=dates, right=df, left_on='Date', right_on='StartDate',
how='outer').fillna(method='ffill')
Date StartDate EndDate
0 2018-11-01 2018-11-01 2018-11-03
1 2018-11-02 2018-11-01 2018-11-03
2 2018-11-03 2018-11-01 2018-11-03
3 2018-11-04 2018-11-04 2018-11-05
4 2018-11-05 2018-11-04 2018-11-05
5 2018-11-06 2018-11-06 2018-11-10
6 2018-11-07 2018-11-06 2018-11-10
7 2018-11-08 2018-11-06 2018-11-10
8 2018-11-09 2018-11-06 2018-11-10
9 2018-11-10 2018-11-06 2018-11-10