ls1549562366 2021-06-29 17:49 采纳率: 40%
浏览 20

pandans赋值这块是否有bug?只是加入一条print()函数,输出结果就变了

加入标红的print(df.loc[26]),输出结果如下,时间差为5天,符合设想

如果将print(df.loc[26])函数去掉,结果就变了,这个是为啥?

 

 

 

import os.path
import pandas as pd
import time


def get_all_excel(dir):  # 定义一个函数,函数名称get_all_excel,需要传入一个目录地址
    """将文件夹中所有excel文件合并成一个DataFrame,并返回"""
    filename_list = []
    for root, dirs, files in os.walk(dir):  # 遍历目录,获取文件名称,目录地址
        # print(root, dirs, files)
        for file in files:
            if file.endswith('xlsx'):
                # print(root+'/'+file )
                filename_list.append(root + '/' + file)  # 将excel拼接成完成的地址,并加入到路径列表中
    dr = pd.DataFrame()
    for filename in filename_list:  # 遍历excel路径列表,将其合并成一个DataFrame
        df1 = pd.read_excel(filename)  # 读取excel
        dr = dr.append(df1, ignore_index=True)  # 将excel拼接到DataFrame里面,并按照新的索引
    return dr


def del_colunms(df):
    """删除掉不用的列"""
    del df['告警ID']
    del df['业务系统']
    del df['资源IP']
    del df['告警信息']
    del df['告警状态']
    del df['恢复来源']
    del df['处理状态']
    del df['资源组']
    del df['指标名称']
    del df['接收人']
    del df['通知状态']
    del df['最近一次调度结果']
    del df['已新建疑似故障']
    del df['调度历史']
    del df['产生原因']
    del df['处理记录']
    del df['关闭时间']
    del df['响应用户']
    del df['响应时间']
    del df['关闭用户']
    del df['处于维护期']
    df.dropna(axis=1, how='all', inplace=True)  # 删除空列


def calculat_time(df):
    """计算最后告警时间和开始告警时间之间的差值"""
    df['首次告警时间'] = pd.to_datetime(df['首次告警时间'])  # 转换为时间类型
    df['最后告警时间'] = pd.to_datetime(df['最后告警时间'])
    if '时间差' in list(df):  # 返回df的columns标签列表,查询‘时间差’是否在列表里面,如果在里面,删除掉重新插入,如果不在里面,直接建立‘时间差’列
        del df['时间差']
        df.insert(3, column='时间差', value=pd.Timedelta('0 hours'))  # 插入一个列,作为后面两个时间计算值的承载
    else:
        df.insert(3, column='时间差', value=pd.Timedelta('0 hours'))  # 插入一个列,作为后面两个时间计算值的承载


def clear_data(df):
    """数据清理,将不需要的数据清理掉"""
    row_indexs = []
    for row_index, row in df.iterrows():
        if '0天0时' in row['持续时间'] or 'MV' not in row['资源名称'] or '紧急' not in row['告警级别'] or \
                '0天1时' in row['持续时间'] or '0天2时' in row['持续时间'] or '0天3时' in row['持续时间']:  # 将持续时间里面小于1小时的筛选出来
            row_indexs.append(row_index)
    df.drop(row_indexs, inplace=True)  # 删除不需要的数据
    df.index = range(0, len(df))  # 重新建立索引


def calau_data(df):
    """接受一个DataFrame,返回前一天的告警信息的索引,"""
    current_time = time.strftime('%Y-%m-%d', time.localtime())  # 返回当天的时间
    end_data = pd.Timestamp(current_time)                       # 根据当天时间生产当天0点的时间类
    start_data = pd.Timestamp(current_time) - pd.Timedelta('1 days')  # 根据当天时间生产当天0点的时间类
    indexs = []   # 定义一个空列表
    for start_row, start_time in df['首次告警时间'].items():
        for end_row, end_time in df['最后告警时间'].items():
            if end_time > start_data and start_time < end_data and start_row == end_row:
                indexs.append(start_row)
    for i in indexs:
        standing = end_data - df['首次告警时间'].at[i]  # 计算出来持续时间
        if standing.days == 0:
            print(standing)
            # df.loc[:, '时间差'].at[i] = f'{standing.hours}小时'
        else:
            df.loc[:, '时间差'].at[i] = f'{standing.days}天'
    return indexs


if __name__ == '__main__':
    adder = 'C:/Users/Hp/Desktop/daliy_report'
    output_excel = 'daliy_result.xlsx'  # 生成excel的地址
    df = get_all_excel(adder)  # 将文件夹中的excel文件合并成一个DataFrame
    del_colunms(df)  # 删除掉不需要的列
    clear_data(df)  # 数据清理
    # df = pd.read_excel('daliy_report.xlsx')
    s = input('请输入需要统计几天的日报:')   # 输入需要统计前几天的记录
    s = int(s)
    df['首次告警时间'] = pd.to_datetime(df['首次告警时间'])  # 将列转换为时间类型
    df['最后告警时间'] = pd.to_datetime(df['最后告警时间'])
    df.insert(3, column='时间差', value='0')  # 插入一个名称为时间差的列,value为字符串0
    if s == 1:
        indexs = calau_data(df)    # 输出前一条的记录
        df.loc[indexs].to_excel(output_excel)   # 输出excel表格
    elif s > 1:
        i = 0
        pd.DataFrame().to_excel(output_excel)   # 创建一个空excel表
        while i < s:
            current_time = time.strftime('%Y-%m-%d', time.localtime())   # 当天的日期
            end_data = pd.Timestamp(current_time) - pd.Timedelta(f'{i} days')   # 输出前一天的日期
            start_data = pd.Timestamp(current_time) - pd.Timedelta(f'{i + 1} days')
            sheet_names = str(start_data.strftime('%Y%m%d'))   # excel表中sheet的名称
            indexs = []
            # 筛选出来符合条件的记录的索引
            for start_row, start_time in df['首次告警时间'].items():
                for end_row, end_time in df['最后告警时间'].items():
                    if end_time > start_data and start_time < end_data and start_row == end_row:
                        indexs.append(start_row)
            i += 1
            # 如果索引存在,计算中断持续时间
            if indexs:
                # print(indexs)
                for n in indexs:    # 遍历索引,计算出来每行的记录的中断持续时间,赋值给时间差那一列
                    standing = end_data - df.at[n,'首次告警时间']  # 计算出来中断持续时间
                    if standing.days == 0:  # 如果中断持续时间小于1天
                        standing = str(standing)     # 将时间类型转成字符串
                        if standing[7] == '0':    # 如果小于10小时
                            df.at[n,'时间差'] = f'{standing[8]}小时'
                        else:                      # 如果大于10小时
                            df.at[n,'时间差'] = f'{standing[7]}{standing[8]}小时'
                    else:     # 如果大于1天,获取中断持续时间中的days属性

                        df.at[n,'时间差'] = f'{standing.days}天'
                        print(df.loc[26])
                with pd.ExcelWriter(output_excel, mode='a') as w:   # 将刷选出来的数据写入前面创建的空excel sheet为日期
                    df.loc[indexs].to_excel(w, sheet_name=sheet_names)
                    print(df.loc[26])
    else:
        print("统计日期输入错误")
  • 写回答

1条回答 默认 最新

  • python收藏家 2021-06-29 18:06
    关注

    两个地方print位置都不一样,输出的不一样很正常,只要你看最后存的结果有没有变化就知道了

    评论

报告相同问题?

悬赏问题

  • ¥15 delphi indy cookie 有效期
  • ¥15 labelme打不开怎么办
  • ¥35 按照图片上的两个任务要求,用keil5写出运行代码,并在proteus上仿真成功,🙏
  • ¥15 免费的电脑视频剪辑类软件如何盈利
  • ¥30 MPI读入tif文件并将文件路径分配给各进程时遇到问题
  • ¥15 pycharm中导入模块出错
  • ¥20 Ros2 moveit2 Windows环境配置,有偿,价格可商议。
  • ¥15 有关“完美的代价”问题的代码漏洞
  • ¥15 请帮我看一下这个简易化学配平器的逻辑有什么问题吗?
  • ¥15 暴力法无法解出,可能要使用dp和数学知识