获取开始日期和结束日期列之间的所有日期

时间:2018-11-21 09:32:34

标签: python pandas date

我使用以下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列值之间的日期。

预期输出:-

enter image description here

我确实在R中尝试了同样的事情。

R Script:- 

   df1 %>%
   rowwise() %>% 
   do(data.frame(.[1:2], date = seq(.$min_date, .$max_date, by = "1 day")))

有人可以建议我吗?

1 个答案:

答案 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