<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: How to fill in a missing date for different customer in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/How-to-fill-in-a-missing-date-for-different-customer/m-p/815993#M322052</link>
    <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile cards expandtabs truncover;
input Date : monyy. CustomerID	Sales $ Credit $;
format Date  monyy.;
cards;
Jan-17	12345	xx	xx
Feb-17	12345	xx	xx
Mar-17	12345	xx	xx
Jun-17	12345	xx	xx
Jul-17	12345	xx	xx
Aug-17	12345	xx	xx
Sep-17	12345	xx	xx
Oct-17	12345	xx	xx
Nov-17	12345	xx	xx
Dec-17	12345	xx	xx
Jan-17	7891	xx	xx
Feb-17	7891	xx	xx
Mar-17	7891	xx	xx
Apr-17	7891	xx	xx
Jun-17	7891	xx	xx
Jul-17	7891	xx	xx
Sep-17	7891	xx	xx
Oct-17	7891	xx	xx
;

data want;
 merge have have(firstobs=2 keep=Date CustomerID rename=(Date=_Date CustomerID=_CustomerID));
 output;
 if CustomerID=_CustomerID then do;
  do i=1 to intck('month',Date,_Date)-1;
   call missing(Sales, Credit);
   Date=intnx('month',Date,1);
   output;
  end;
 end;
 drop i _:;
 run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
    <pubDate>Wed, 01 Jun 2022 05:16:58 GMT</pubDate>
    <dc:creator>Ksharp</dc:creator>
    <dc:date>2022-06-01T05:16:58Z</dc:date>
    <item>
      <title>How to fill in a missing date for different customer</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-fill-in-a-missing-date-for-different-customer/m-p/815987#M322048</link>
      <description>&lt;P&gt;I would like to ask how can I code to fill in the missing date between the beginning period and the most recent date available for each customer as illustrated below:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;assuming below is my data:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;Date&lt;/TD&gt;&lt;TD&gt;Customer ID&lt;/TD&gt;&lt;TD&gt;Sales&lt;/TD&gt;&lt;TD&gt;Credit&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Jan-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Feb-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Mar-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Jun-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Jul-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Aug-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Sep-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Oct-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Nov-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Dec-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Jan-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Feb-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Mar-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Apr-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Jun-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Jul-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Sep-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Oct-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I want to generate something like this instead:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;Date&lt;/TD&gt;&lt;TD&gt;Customer ID&lt;/TD&gt;&lt;TD&gt;Sales&lt;/TD&gt;&lt;TD&gt;Credit&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Jan-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Feb-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Mar-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Apr-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;.&lt;/TD&gt;&lt;TD&gt;.&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;May-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;.&lt;/TD&gt;&lt;TD&gt;.&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Jun-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Jul-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Aug-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Sep-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Oct-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Nov-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Dec-17&lt;/TD&gt;&lt;TD&gt;12345&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Jan-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Feb-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Mar-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Apr-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;May-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;.&lt;/TD&gt;&lt;TD&gt;.&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Jun-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Jul-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Aug-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;.&lt;/TD&gt;&lt;TD&gt;.&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Sep-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Oct-17&lt;/TD&gt;&lt;TD&gt;7891&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;TD&gt;xx&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;As you can see from the data, the beginning date for customer 12345 is starting from Jan 2017 and the most recent date is Dec 2017, however, there are missing dates in between the beginning date and the latest date (April and May 2017). While for customer 7891, the beginning date is starting from Jan 2017 and the most recent date is Oct 2017,&amp;nbsp;but there are also missing dates in between the beginning date and the latest date (May and Aug 2017). Hence, in this case, I just want to fill in the missing dates between their beginning date and their latest date available. In other ways, meaning that I want customer 12345 to have date from Jan 2017 to Dec 2017 while customer 7891 to have date from Jan 2017 to Oct 2017 only, with the missing date's and its data fields imputed with missing value ".".&amp;nbsp; I tried to use proc expand initially (tested on few customers and it succeed), however, proc expand does not allow for big data (around 40millions), and it will show workspace error/failed. Hence, is there any alternative way to fill in the missing date in between the beginning date and most recent date available for a customer (SAS)?&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 01 Jun 2022 04:16:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-fill-in-a-missing-date-for-different-customer/m-p/815987#M322048</guid>
      <dc:creator>heretolearnSAS</dc:creator>
      <dc:date>2022-06-01T04:16:07Z</dc:date>
    </item>
    <item>
      <title>Re: How to fill in a missing date for different customer</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-fill-in-a-missing-date-for-different-customer/m-p/815993#M322052</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile cards expandtabs truncover;
input Date : monyy. CustomerID	Sales $ Credit $;
format Date  monyy.;
cards;
Jan-17	12345	xx	xx
Feb-17	12345	xx	xx
Mar-17	12345	xx	xx
Jun-17	12345	xx	xx
Jul-17	12345	xx	xx
Aug-17	12345	xx	xx
Sep-17	12345	xx	xx
Oct-17	12345	xx	xx
Nov-17	12345	xx	xx
Dec-17	12345	xx	xx
Jan-17	7891	xx	xx
Feb-17	7891	xx	xx
Mar-17	7891	xx	xx
Apr-17	7891	xx	xx
Jun-17	7891	xx	xx
Jul-17	7891	xx	xx
Sep-17	7891	xx	xx
Oct-17	7891	xx	xx
;

data want;
 merge have have(firstobs=2 keep=Date CustomerID rename=(Date=_Date CustomerID=_CustomerID));
 output;
 if CustomerID=_CustomerID then do;
  do i=1 to intck('month',Date,_Date)-1;
   call missing(Sales, Credit);
   Date=intnx('month',Date,1);
   output;
  end;
 end;
 drop i _:;
 run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 01 Jun 2022 05:16:58 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-fill-in-a-missing-date-for-different-customer/m-p/815993#M322052</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2022-06-01T05:16:58Z</dc:date>
    </item>
    <item>
      <title>Re: How to fill in a missing date for different customer</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-fill-in-a-missing-date-for-different-customer/m-p/815995#M322053</link>
      <description>&lt;P&gt;You want to fill in interior "holes" in a time series.&amp;nbsp; You can do this with a "lookahead merge":&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want (drop=_: nxt_:);
  merge have (keep=id date)
        have (firstobs=2 keep=date rename=(date=nxt_date)) ;

  retain _sentinel1 .;
  set have;
  by id;
  retain _sentinel2 .;
  output;

  if last.id=0 and intck('month',date,nxt_date&amp;gt;1);

  call missing(of _sentinel1 -- _sentinel2);

  do while (intck('month',date,nxt_date)&amp;gt;1);
    date=intnx('month',date,1);
    output;
  end;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;The reason for the &lt;EM&gt;&lt;STRONG&gt;_sentinel&lt;/STRONG&gt;&lt;/EM&gt; variables is to provide left and right endpoints for all the variables to be reset to missing when filling in the holes.&amp;nbsp; Instead of listing those variables, you can just use the variable listing syntax&amp;nbsp; &lt;EM&gt;&lt;STRONG&gt;(of sentinel1 -- _sentinel2)&lt;/STRONG&gt;&lt;/EM&gt;.&amp;nbsp; This would be all the variables brought in by the SET statement, EXCEPT variables named in the preceding MERGE statement.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 01 Jun 2022 06:06:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-fill-in-a-missing-date-for-different-customer/m-p/815995#M322053</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2022-06-01T06:06:43Z</dc:date>
    </item>
    <item>
      <title>Re: How to fill in a missing date for different customer</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-fill-in-a-missing-date-for-different-customer/m-p/816003#M322056</link>
      <description>&lt;P&gt;Hi Ksharp, thanks for your prompt response. If let's say I have 50 data fields (other than Sales and Credit listed in the examples only), how could I further amend the code to call missing of those 50 data fields? is there any efficient way than listing the column name one by one down?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;let's assume there is column 1 to column 50 (data fields for each customer at each observation point)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 01 Jun 2022 07:06:03 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-fill-in-a-missing-date-for-different-customer/m-p/816003#M322056</guid>
      <dc:creator>heretolearnSAS</dc:creator>
      <dc:date>2022-06-01T07:06:03Z</dc:date>
    </item>
    <item>
      <title>Re: How to fill in a missing date for different customer</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-fill-in-a-missing-date-for-different-customer/m-p/816008#M322058</link>
      <description>If these variables are set next to each other , you can use mkeintz suggested:&lt;BR /&gt;call missing(of a --  x);&lt;BR /&gt;&lt;BR /&gt;a is the first variable,&lt;BR /&gt;x is the last variable,&lt;BR /&gt;a -- x represent all the variables between a and x.&lt;BR /&gt;&lt;BR /&gt;Or if your variable name like col1 col2 ..... col100, you could try this:&lt;BR /&gt;call missing(of col1-col100);</description>
      <pubDate>Wed, 01 Jun 2022 08:02:29 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-fill-in-a-missing-date-for-different-customer/m-p/816008#M322058</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2022-06-01T08:02:29Z</dc:date>
    </item>
  </channel>
</rss>

