首先公司希望通过证件编号的记录表来实现一个输入当前任意日期的上一个表状态进行返回,这个重任就落到了我的头上,首先说说我的思路,
1.首先把三个记录表合成一个宽表,由于记录表的记录是主表触发器的出来的
2.将主表的主键和记录表的主键互相连接好生成对应的返回的值
3.构建输入日期和输入证件编号的input
4.通过输入进行匹配
5.分别将更变信息表中的日期减去输入日期
6.通过日期的插值取最小的正整数(抽取输入日期上一次变更的值)
7.将值插入到主表中返回当前的状态
废话不说直接上代码,中途也遇到一些问题,问题如下
1.已经得出最优的日期不知道怎么插入指标,
2.将数据导入换成数据库之后报错代码块如下
modi_time = list(set(data[‘CREATE_TIME’].map(
lambda x:datetime.strftime(
datetime.strptime(x,"%Y-%m-%d %H:%M:%S"),"%Y%m%d"))))
报错内容为:
TypeError: strptime() argument 1 must be str, not Timestamp
#测试表查询表,模仿查询的一条信息,由于数据库配置不上先用本地导入
zj_df = pd.read_csv(r’C:\Users\asus\Desktop\T_LIC_RLIC_INFO.csv’)
#将本地数据导入进来
NAME_DF = pd.read_csv(r’C:\Users\asus\Desktop\T_L_LOG_OPERATION.csv’)
BG_DF = pd.read_csv(r’C:\Users\asus\Desktop\T_L_LOG_DETAIL.csv’)
TYPE_DF = pd.read_csv(r’C:\Users\asus\Desktop\T_L_LOG_TABLE_INFO.csv’)
aa = []
for i in zj_df[‘LIC_UUID’]: #遍历证件表的主键
for j in data[‘DATA_PK_VALUE’]: #遍历在历史变更信息表中证件表的主键
if i == j: #判断相等
#print([str(k) for k in zj_df[‘LIC_NO’]])
select_lic_no =input(‘请输入要查询的证件编号:’) #输入查询许可证编号"211421000000.0"#
select_create_time =int(input(‘请输入要查询的时间:’))#输入查询当前日期"20160421"#
#判断输入的日期是否满足条件 许可证编号 在 证件表里面 和输入的时间 是否大于 记录表时间
if select_lic_no in [str(k) for k in zj_df[‘LIC_NO’]]:
#判断生效代表此许可证存在变更,进行将上一次更变后的值替换进入证件表
print(‘证件编号存在变更记录,进入上一次变更日期的判断’)
print(’-’*50)
#进行日期的去重
modi_time = list(set(data['CREATE_TIME'].map(
lambda x:datetime.strftime(
datetime.strptime(x,"%Y-%m-%d %H:%M:%S"),"%Y%m%d"))))
print('去重完毕进行判断')
dstinct_modi_time = min(list(modi_time))
print('去重完毕')
#返回要变更的日期
if select_create_time > int(dstinct_modi_time):
print('输入日期存在变更记录,返回输入日期前一次的变更后记录')
#日期相减取最接近的正整数
alter_time_value = list(map(lambda x:int(x)-select_create_time,list(modi_time)))
#拿到最合适的日期
later_time = dict(zip(alter_time_value,modi_time))
#拿到对应日期的数据索引
moditime = list(filter(lambda x:x >=0,list(later_time.keys())))
moditime.sort()
#取出对应的日期
modi_time_new = max(list(map(lambda x:later_time[x],moditime)))
ft_index = (data.DATA_PK_VALUE == i) & (
data['CREATE_TIME'].map(
lambda x:datetime.strftime(
datetime.strptime(
x,"%Y/%m/%d %H:%M:%S"),"%Y%m%d"))== modi_time_new )
print(data.loc[ft_index,])
#数据替换进入原纪录
print('对应日期数据已经提取完毕,进行主表更新')
modi_data = data.loc[ft_index,]
#将证件表数据替换
aa.append(data.loc[ft_index,])
break
#返回max(modi_time)当前的数据
else:
print('数据未曾更改,直接返回原表')
break
break
else:
print('没有存在变更记录,返回当前的值')
break
本文介绍了一种基于历史记录表的证件状态查询与更新算法,通过整合多个记录表为宽表,连接主副表主键,构建输入界面,利用日期插值方法找到输入日期前最近的证件状态变更,实现证件状态的高效查询与更新。

3万+

被折叠的 条评论
为什么被折叠?



