• pandas 根据两个初始时间差生成对应行数


    比如说,初始日期分别是20200101,20201201,我要生成如下

    代码如下:

    list1=[]  #用于储存id
    list2=[] #用于储存date
    for i in range(len(tmp)):
        #生成时间序列
        obs_list = [str(i.date()) for i in (pd.date_range(start = tmp.iloc[i].opendate, 
                                                          end= tmp.iloc[i].enddate, 
                                                          freq = 'M')).tolist()]
        list1.append(obs_list) #date
        l=len(obs_list) #
        coll=[tmp.iloc[i].ref_id]*l 
        list2.append(coll)
    from itertools import chain  #用于展平里面的[]
    dict1=pd.DataFrame({'ref_id':list(chain(*list2)),'data':list(chain(*list1))})
    dict1

     注意,上面的tmp其实是一个表,里面有三个字段,分别是ref_id,opendate,enddate

    我们重新修改了一下,写成函数

    def date_to_row(df):
        '''
        df 有字段id,opendate,enddate三个字段组成
        这次是按照月份差生成行数,还可以按照天数差生成
        '''
        df_out_1=pd.DataFrame(columns=['id','opendate','enddate'])
        for i in range(len(df)):
        #生成时间序列
            df_out = pd.DataFrame()
            date_list = [str(i.date()) for i in (pd.date_range(start = df.iloc[i].opendate, 
                                                          end= df.iloc[i].enddate, 
                                                          freq = 'M')).tolist()]
            len_date = len(date_list)
             
            df_out['id'] = [df.iloc[i].id]*len_date
            df_out['opendate'] = [df.iloc[i].opendate]*len_date
            df_out['enddate'] = [df.iloc[i].enddate]*len_date
            df_out['row_date'] = date_list
            df_out_1 = df_out_1.append(df_out)
        return df_out_1

    值得注意的是,写for循环时,我们可以在for外面建立一个空表,在for循环里面建立一个空表,然后外面的表不断append里面的表,最后输出外面的表

    验证结果如下;

    a=data_merge[['reportno','opendate','enddate']].head(5)
    a=a.rename(columns={'reportno':'id'})
    a
    date_to_row(a)

     

     最后可以使用表连接或者合并的功能

    写这些主要用于历史数据回溯,比如说计算vintage 等

  • 相关阅读:
    2017年系统架构设计师论文范文
    在SQL Server 2008中执行透明数据加密(转自IT专家网)
    开发笔记
    [置顶] GO-Gin框架快速指南
    [置顶] JS-逆向爬虫
    [置顶] ES篇
    [置顶] GO
    [置顶] 爬虫入狱指南
    [置顶] websocket
    [置顶] Linux篇
  • 原文地址:https://www.cnblogs.com/cgmcoding/p/14063436.html
Copyright © 2020-2023  润新知