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
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