将日期转换为熊猫日期范围的方法?

时间:2021-04-11 02:52:40

标签: python pandas dataframe

如果您有基于条件的日期列表,例如:

df

date                  random_values
2020-03-01                   1
2020-03-02                   2
2020-03-03                   2
2020-04-01                   8
2020-04-02                   9 
2020-04-03                   10
2020-05-01                   7
2020-05-02                   8 
2020-05-03                   10
2020-05-04                   20

前条件: df['date'].where(df.random_values >= 8)

将产生以下日期:

2020-04-01                   
2020-04-02                    
2020-04-03
2020-05-02                    
2020-05-03 
2020-05-04

例如,虽然这个日期数量很好,但我的数据有数百个日期。我想减少日期,以便它产生与此类似的输出:

2020-04-01: 2020-04-03
2020-05-01: 2020-05-04 

我只是想减少日期的数量并使它们轻松地进入日期范围。有什么简单的方法可以做到这一点?

2 个答案:

答案 0 :(得分:4)

假设 df.date 是一个正确的 datetime 列并且您已经查询了所需的 dates

df.date = pd.to_datetime(df.date)
dates = df.date.where(df.random_values >= 8)

您可以通过加入每个月的第一个和最后一个日期 groupby(dates.dt.month)apply() 您的自定义输出格式 .iloc[[0,-1]]

dates.groupby(dates.dt.month).apply(
    lambda month: ': '.join(month.iloc[[0,-1]].astype(str)))

# date
# 4.0    2020-04-01: 2020-04-03
# 5.0    2020-05-02: 2020-05-04
# Name: date, dtype: object

答案 1 :(得分:1)

也试试这个:

df = pd.read_clipboard()

df['date'] = pd.to_datetime(df['date'])

s  = df.loc[df['random_values'] >= 8, 'date']
grp = (s.diff() != pd.Timedelta(days=1)).cumsum()

s.groupby(grp).agg(lambda x: f"{x.iloc[0].strftime('%Y-%m-%d')}: {x.iloc[-1].strftime('%Y-%m-%d')}")

输出:

date
1    2020-04-01: 2020-04-03
2    2020-05-02: 2020-05-04
Name: date, dtype: object