如果您有基于条件的日期列表,例如:
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
我只是想减少日期的数量并使它们轻松地进入日期范围。有什么简单的方法可以做到这一点?
答案 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