【问题标题】:Compare data frame column values in datetime with integer?将日期时间中的数据框列值与整数进行比较?
【发布时间】:2019-12-17 09:35:34
【问题描述】:

我有一个包含日期的数据框列(已转换为日期时间格式)。现在我需要将列中的年份与一个数字进行比较,例如:

Date 
01-02-2018
04-07-2016
09-09-2019

我想进行这样的比较:

if dfA['Date'].dt.year == current:
   ## do something

有两个问题:

代码给了我这个错误

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

并且数字来自分配给名称 current 的用户输入(我使用以下代码将 current 转换为 int):

current = int(args.User_Input)

不知道为什么它给我一个错误

【问题讨论】:

    标签: python dataframe datetime


    【解决方案1】:

    出现错误是因为语句dfA['Date'].dt.year == current 是pandas.Series 布尔值,而不是单个布尔值:

    dfA['Date'].dt.year == 2018
    # 0     True
    # 1    False
    # 2    False
    # Name: Date, dtype: bool
    

    python if 语句不知道如何处理:if 语句下的代码块是否应该运行,因为该系列中的任何值都是真的?或者它不应该因为不是所有的值都是真的而运行?或者它是否应该运行,因为 Series 本身不是虚假值,例如 None 或零?意图不明确,因此出现错误。

    如果您想对满足您指定条件的所有列在 DataFrame 上执行一些操作,请考虑使用Boolean indexing。您制作的 Series 可用于选择 DataFrame 的某些行,如下所示:

    dfA['example'] = 100
    is_matching_year = dfA['Date'].dt.year == 2018
    dfA.loc[is_matching_year, 'example'] *= 2
    print(dfA[['Date', 'example']])
    #         Date  example
    # 0 2018-01-02      200
    # 1 2016-04-07      100
    # 2 2019-09-09      100
    

    【讨论】:

      【解决方案2】:
      # Creating the data you specified
      times = ['01-02-2018',
              '04-07-2016',
              '09-09-2019']
      
      #converting to a dataframe
      dfA = pd.DataFrame(times)
      
      #Renaming the dataframe to the correct name
      dfA.rename(columns={0:'Date'},inplace=True)
      
      #formatting
      dfA['Date'] = pd.to_datetime(dfA['Date'], format='%m-%d-%Y')
      
      #User input. Must be an int
      currentYear = int(input('Enter Year:'))
      
      #Need to specify the index number using .values[n] to specify which year you're testing against
      if dfA['Date'].dt.year.values[0] == currentYear:
          print('Do Something')
      

      【讨论】:

        【解决方案3】:

        如果dfA['Date'] 中的任何年份等于current,我假设您希望您的if 子句评估为True? 如果是这样,你可以这样做:

        if dfA['Date'].dt.year.eq(current).sum():
           # do something
        

        【讨论】:

        • 如果我想说更小怎么办?
        • @BrunnaT。然后你可以做if dfA['Date'].dt.year.le(current+1).sum():。如果任何年份小于current,它将评估为真
        猜你喜欢
        • 2019-10-14
        • 2022-01-01
        • 2019-10-17
        • 2016-03-02
        • 2019-03-12
        • 2019-02-18
        • 2020-01-24
        • 2017-05-03
        • 1970-01-01
        相关资源
        最近更新 更多