【问题标题】:Select rows between two dates - recent 3 month period -选择两个日期之间的行 - 最近 3 个月 -
【发布时间】:2021-09-14 13:59:53
【问题描述】:

我有一个数据框,我正在尝试选择两个日期之间的行(最近 3 个月),我找到了这个解决方案 here

这是我的数据框的头

        week    storeA  storeB  storeC  storeD  storeE
0   2014-05-04  2643    8257    3893    6231    1294
1   2014-05-11  6444    5736    5634    7092    2907
2   2014-05-18  9646    2552    4253    5447    4736
3   2014-05-25  5960    10740   8264    6063    949
4   2014-06-01  7412    7374    3208    3985    3023

首先,我将数据框的“周”列转换为 datetime64[ns] 格式:

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

我得到这样的开始和结束日期

    start_date = pd.to_datetime(df.tail(1)['week'] - pd.DateOffset(months=3))
    end_date = pd.to_datetime(df.tail(1)['week']) 

    # start_date : 199   2017-11-25 Name: week, dtype: datetime64[ns] 
    #end_date : 199   2018-02-25 Name: week, dtype: datetime64[ns]

然后我尝试选择行:

    mask = (df['week'] > start_date) & (df['week'] <= end_date)
    df.loc[mask]

这里我得到这个错误:

ValueError: Can only compare identically-labeled Series objects

我尝试将日期写为字符串,它可以工作:

    mask = (df['week'] > '2017-11-25') & (df['week'] <= '2018-02-25')
    df.loc[mask]

我尝试将开始日期转换为字符串,它可以工作

    start_date = str(start_date)[6:16]
    end_date = str(end_date)[6:16]

那么,导致错误的原因是什么?

【问题讨论】:

    标签: python pandas dataframe date valueerror


    【解决方案1】:

    按照你的代码,我发现'start_date'和'end_date'的数据类型都是系列(不是像df['week']这样的时间戳)。检查人:

    type(df['week'][0]), type(start_date)
    

    那么它们就无法比较了。 你可以试试这个代码:
    id = start_date.index[0]

    start_date = pd.to_datetime(start_date[id])

    注意:“id”存储索引(根据你的数据,是199。)

    【讨论】:

    • 是的,正确的 type(df['week'][0]) 是 并且 type(start_date) 是
    • 我们如何将其转换为时间戳?
    • 我试图用这种方法转换它:Series.to_timestamp(freq=None, how='start', copy=True) 但它给了我这个错误:AttributeError: 'RangeIndex' object has no属性“to_timestamp”
    • 查看我的修订版 :-)
    猜你喜欢
    • 2016-12-28
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    相关资源
    最近更新 更多