【问题标题】:Python pandas print value where column = X and row = YPython pandas 打印值,其中列 = X 和行 = Y
【发布时间】:2020-09-07 09:16:06
【问题描述】:

我对使用 python 和 pandas 比较陌生,我正在尝试使用 python 获取 excel 工作表中单元格的值。更糟糕的是,我正在使用的 Excel 工作表没有正确的列名。

数据框如下所示:

Sign       Name       2020-09-05 2020-09-06 2020-09-07
JD         John Doe   A          A          B
MP         Max Power  B          B          A

我要做的是打印列标题为当前日期且符号为“MP”的“单元格”的值。

到目前为止我尝试过的是:

import pandas as pd
from datetime import datetime

time=datetime.now()
relevant_sheet = time.strftime("%B" " %y")
current_day = time.strftime("%Y-%m-%d")

excel_file = pd.ExcelFile('theexcelfile.xlsx')
df = pd.read_excel(excel_file, relevant_sheet, skiprows=[0,1,2,3]) # I don't need these
relevant_value = df.loc[df['Sign'] == "MP", df[current_day]]

这给了我 current_day 的一个关键错误:

KeyError: '2020-09-07'

要完全披露我正在使用的真实数据框的任何可能问题:如果我只是打印数据框,我会得到如下所示的列:

2020-09-01 00:00:00

这就是为什么我也尝试过:

current_day = time.strftime("%Y-%m-%d 00:00:00")

当然,我也“手动”尝试了各种日期格式,但无济于事。我在这件事上完全错了吗?这个excel是不是坑我了?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果列名称是日期时间,则使用 Timestamp.floor 删除时间(将它们设置为 00:00:00):

    current_day = pd.to_datetime('now').floor('d')
    print (current_day)
    2020-09-07 00:00:00
    
    relevant_value = df.loc[df['Sign'] == "MP", current_day]
    

    如果列名是字符串格式的日期时间,则使用:

    relevant_value = df.loc[df['Sign'] == "MP", current_day]
    

    如果有python日期:

    current_day = pd.to_datetime('now').date()
    print (current_day)
    2020-09-07
    
    relevant_value = df.loc[df['Sign'] == "MP", current_day]
    

    【讨论】:

    • .floor('d') 做到了!非常感谢。
    【解决方案2】:

    您只需要传递列名而不是 df[col_name]

    详情请查看.loc[]

    df.loc[df['Sign'] == "MP", current_day]
    

    【讨论】:

      【解决方案3】:

      使用df.filter 过滤相关列。

      通过提取今天的日期并将其转换为字符串来获取相关列。

      继续并在Sign 中查询MP

      df.loc[df['Sign']=='MP',(dt.date.today()).strftime('%Y-%m-%d')]
      

      【讨论】:

        【解决方案4】:

        对你做事方式的微小改变会给你带来结果。

        第 1 步:去掉 00:00:00(如果您只想要日期值)

        第 2 步:您的条件有一个额外的 df[]

        #strip last part of the column names if column starts with 2020 
        df.rename(columns=lambda x: x[:10] if x[:4] == '2020' else x, inplace=True)
        
        current_day = datetime.date(datetime.now()).strftime("%Y-%m-%d")
        
        relevant_value = df.loc[df['Sign'] == 'MP', current_day] #does not need df before current_day
        print(relevant_value)
        

        由于您已经在使用 pandas,因此无需导入 datetime。你可以给这个以 yyyy-mm-dd 格式获取你的日期

        current_day = pd.to_datetime('now').strftime("%Y-%m-%d")
        

        【讨论】:

          猜你喜欢
          • 2013-04-22
          • 2017-04-02
          • 2014-08-12
          • 2013-09-01
          • 1970-01-01
          • 2014-03-17
          • 2021-03-25
          • 1970-01-01
          • 2018-10-09
          相关资源
          最近更新 更多