【问题标题】:Filter on rows based on date range. Error with date format根据日期范围过滤行。日期格式错误
【发布时间】:2020-03-09 06:11:41
【问题描述】:

我想根据数据框系列中最大值日期两侧的日期范围过滤数据框。过滤适用于手动输入的日期,例如'2018-01-05' 但是当该日期存储在系列对象中时,它将不起作用 - 我太厚了,无法弄清楚原因。 我尝试过字符串转换并从系列中提取日期作为值,但无济于事。这是一个程式化的版本:

    data = {'dates':['2018-01-01','2018-01-02','2018-01-03','2018-01-04','2018-01-05', \
    '2018-01-06'],'values':[-20,30,15,10,4,7]}
    data = pd.DataFrame(data)
    data.dates = pd.to_datetime(data.dates,dayfirst=True)

    maxval = data.nlargest(1,'values')
    maxdate = maxval.loc[:,'dates']

    start_remove = maxdate-timedelta(days=1)
    end_remove = maxdate+timedelta(days=1)

    data.loc[(data['dates']<start_remove) | (data['dates']>end_remove)]

给出 ValueError:只能比较标签相同的 Series 对象

而:

    data.loc[(data['dates']<'2018-01-03) | (data['dates']>'2018-01-05)]

工作得很好。

【问题讨论】:

    标签: python pandas dataframe datetime filter


    【解决方案1】:

    您可以使用Series.idxmax 获取最大values 的索引值:

    maxdate = data.set_index('dates')['values'].idxmax()
    

    问题是maxdate 是一个元素Series 而不是标量,可能的解决方案是使用DataFrame.iatIndex.get_loc 按位置选择列dates 的位置:

    maxdate = maxval.iat[0, maxval.column.get_loc('dates')]
    

    或者通过DataFrame.at标签选择并获取索引的第一个值:

    maxdate = maxval.at[maxval.index[0], 'dates']
    
    print (maxdate)
    2018-01-02 00:00:00
    

    【讨论】:

    • 非常感谢。对于一个简单的问题,这令人沮丧。为什么我不能以 maxval['dates'] 的形式访问 maxdate 或将其转换为 str(maxval['dates'] 尚不清楚。
    • @Lymacro - 我认为原因是大多数通用功能,但同意,这不容易找到问题。如果我的回答有帮助,请不要忘记accept。谢谢。
    猜你喜欢
    • 2020-02-15
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2011-12-04
    • 1970-01-01
    相关资源
    最近更新 更多