Пример #1
0
    def build_Data(self,path):
        '''
        使用工厂方法(现已修改)
        根据报文类型(水文、气象)以及根目录:
            1、获取所有匹配的文件全目录集合
            2、
        :param data_type:
        :return:
        '''

        # stations_list= self.getmatchingFiles(os.path.join(path,self.station.stationname),self.date)
        # 先获取文件目录
        # 注意此处获取的文件全路径时传入的时间的当月的全部文件
        files,ignorefiles=self.getmatchingFiles(os.path.join(path,self.station.stationname),self.date)
        # 创建空的dataframe
        # 注意此处与HydrologyData.getDataResult中均用到Common.DateHelper(self.date)!!!!!需要再修改
        date_helper = Common.DateHelper(self.date)
        temp_date = date_helper.date_factory(enum_model.DataType.Hydrology)

        df_all= self.__creatNaDataframe(temp_date.list_date_allmonth)
        # temp_perclock_data=None
        '''
        下面重新修改
            1 遍历文件集合
            2 对当前的文件根据其类型实例化对应的内部类
            3 调用getDataResult方法
        '''
        for temp_file in files:
            # 遍历文件名集合,并对其分类
            # 使用工厂方式创建的水文和气象数据对象均要实现getDataResult方法
            temp_data_hy=None
            temp_data_me = None
            # 此处不再使用判断传入的类型,改为遍历的水文、气象两种类型的数据
            # for temp_enum in enum_model.DataType:
            print("正在录入%s"%temp_file.fullname)
            temp_data_hy = self.HydrologyData(temp_file.fullname, self.station, temp_file.targetdate, temp_file.element)
            result_hy = temp_data_hy.getDataResult()
            if result_hy is None:
                continue
            df_all = df_all.combine_first(result_hy)

            temp_data_me = self.MeteorologyData(temp_file.fullname, self.station, temp_file.targetdate, temp_file.element)
            result_me = temp_data_me.getDataResult()
            if result_me is None:
                continue
            df_all = df_all.combine_first(result_me)
            print("录入成功")
            # if data_type is enum_model.DataType.Hydrology:
            #     # 此处有问题,遍历的file对象应该是对每个file对象获取其对应的时间,而不能使用self.date
            #     temp_data= self.HydrologyData(temp_file.fullname,self.station,temp_file.targetdate,temp_file.element)
            # elif data_type is enum_model.DataType.Meteorology:
            #     temp_data= self.MeteorologyData(temp_file.fullname,self.station,temp_file.targetdate,temp_file.element)
            # result=temp_data.getDataResult()
            # df_all=df_all.combine_first(result)
            # temp_perclock_data.getDataResult()
        return df_all
Пример #2
0
    def getDataResult(self):
        """
         获取数据:
        具体步骤如下:
        1 生成时间list
        2 读取指定文件
        3 对读取后的dataframe进行转换
        4 将最终结果返回

        存在的设计问题:
        由于是外侧类的工厂方法调用,而外侧的类中getmatchingFiles方法是生成该月的所有匹配文件集合
        :return:
        """
        date_helper = Common.DateHelper(self.targetdate)
        temp_date = date_helper.date_factory(enum_model.DataType.Meteorology)

        isOK = self.getTargetDayData()
        # 若读取时出错时直接跳出
        if isOK == False:
            return
        if self.element.lower() != 'ws':
            # self.__read_table()
            # 删除数据的date列
            del self.result['date']
            # 转置
            self.result = self.result.T
            # 切片获取0-23点的数据,去掉min与max
            self.result = self.result[:-2]
            # 对df的index赋值
            self.result.index = temp_date.list_date
            # 对df的columns赋值
            # columns就是at hu 等等
            self.result.columns = [self.element]
        # 注意风向风速的要特殊处理!!!
        elif self.element.lower() == 'ws':
            # 获取第一行(相当于是列头)ß
            columns = self.result.columns
            # 获取剔除第一个日期之外的其他值
            self.result = pd.DataFrame(columns)[1:]
            # 修改形状
            self.result = pd.DataFrame(self.result.values.reshape((24, 2)))
            self.result.index = temp_date.list_date
            self.result.columns = ['WD', 'WS']
        return self.result