hyb
2026-01-09 4cb426cb3ae31e772a09d4ade5b2f0242aaeefa0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
Ë
nñúh;ã    óH—dZddlmZddlmZddlmZddlZddlmZddl    Z    ddl
Z ddl m Z ddlmZddlZdd    lmZdd
lmZer dd lmZmZmZmZd Zd ZdZdZgd¢ZdZ dZ!dZ"dZ#de ›de"›de!›de#›d    Z$de ›de!›dZ%dZ&d!d„Z'd"d„Z(d„Z)d„Z*Gd„d eejV«Z,y)#a-
Read a SAS XPort format file into a Pandas DataFrame.
 
Based on code from Jack Cushman (github.com/jcushman/xport).
 
The file format is defined here:
 
https://support.sas.com/content/dam/SAS/support/en/technical-papers/record-layout-of-a-sas-version-5-or-6-data-set-in-sas-transport-xport-format.pdf
é)Ú annotations)Úabc)ÚdatetimeN)Ú TYPE_CHECKING)ÚAppender)Úfind_stack_level)Ú
get_handle)Ú
ReaderBase)ÚCompressionOptionsÚDatetimeNaTTypeÚFilePathÚ
ReadBufferzPHEADER RECORD*******LIBRARY HEADER RECORD!!!!!!!000000000000000000000000000000  zKHEADER RECORD*******MEMBER  HEADER RECORD!!!!!!!000000000000000001600000000zPHEADER RECORD*******DSCRPTR HEADER RECORD!!!!!!!000000000000000000000000000000  zPHEADER RECORD*******OBS     HEADER RECORD!!!!!!!000000000000000000000000000000  )ÚntypeÚnhfunÚ field_lengthÚnvar0ÚnameÚlabelÚnformÚnflÚ num_decimalsÚnfjÚnfillÚniformÚniflÚnifdÚnposÚ_z‚Parameters
----------
filepath_or_buffer : str or file-like object
    Path to SAS file or object implementing binary read method.zâindex : identifier of index column
    Identifier of column that should be used as index of the DataFrame.
encoding : str
    Encoding for text data.
chunksize : int
    Read file `chunksize` lines at a time, returns iterator.zBformat : str
    File format, only `xport` is currently supported.z\iterator : bool, default False
    Return XportReader object for reading file incrementally.z#Read a SAS file into a DataFrame.
 
ú
a
 
Returns
-------
DataFrame or XportReader
 
Examples
--------
Read a SAS Xport file:
 
>>> df = pd.read_sas('filename.XPT')
 
Read a Xport file in 10,000 line chunks:
 
>>> itr = pd.read_sas('filename.XPT', chunksize=10000)
>>> for chunk in itr:
>>>     do_something(chunk)
 
z$Class for reading SAS Xport files.
 
 
Attributes
----------
member_info : list
    Contains information about the file
fields : list
    Contains information about the variables in the file
zÊRead observations from SAS Xport file, returning as data frame.
 
Parameters
----------
nrows : int
    Number of rows to read from data file; if None, read whole
    file.
 
Returns
-------
A DataFrame.
cón—    tj|d«S#t$rtjcYSwxYw)z1Given a date in xport format, return Python date.z%d%b%y:%H:%M:%S)rÚstrptimeÚ
ValueErrorÚpdÚNaT)Údatestrs úJH:\Change_password\venv_build\Lib\site-packages\pandas/io/sas/sas_xport.pyÚ _parse_dater'“s3€ðä× Ñ  Ð*;Ó<Ð<øÜ ò܏v‰vŠ ðús ‚˜4³4cód—i}d}|D]#\}}||||zj«||<||z }Œ%|d=|S)a
    Parameters
    ----------
    s: str
        Fixed-length string to split
    parts: list of (name, length) pairs
        Used to break up string, name '_' will be filtered from output.
 
    Returns
    -------
    Dict of name:contents of string at given location.
    rr)Ústrip)ÚsÚpartsÚoutÚstartrÚlengths      r&Ú _split_liner/œsU€ð €CØ €EØò‰ ˆˆfؐe˜e f™nÐ-×3Ñ3Ó5ˆˆD‰    Ø ‰‰ðð     ˆCˆØ €Jócóâ—|dk7ritjt|«tjd««}tjd|›dd|z
›«}|j    |¬«}||d<|S|S)NéÚS8ÚSz,S©ÚdtypeÚf0)ÚnpÚzerosÚlenr6Úview)ÚvecÚnbytesÚvec1r6Úvec2s     r&Ú_handle_truncated_float_vecr@²si€ð‚{܏x‰xœ˜C›¤"§(¡(¨4£.Ó1ˆÜ—‘˜1˜V˜H B q¨6¡z lÐ3Ó4ˆØy‰y˜uˆyÓ%ˆØˆˆT‰
؈ à €Jr0cóˆ—tjd«}|j|¬«}|d}|d}|dz}tjt    |«tj
¬«}d|tj |dz«<d|tj |d    z«<d
|tj |d z«<||z}||z    |d zd d
|z
zzz}|dz}||dz    dzdz
dz|zdzdz|dzzz}tjt    |«fd¬«}||d<||d<|jd¬«}|jd«}|S)zf
    Parse a vector of float values representing IBM 8 byte floats into
    native 8 byte floats.
    z>u4,>u4r5r7Úf1iÿÿÿéi éi@éi€éélÿßéééAiÿélz>f8Úf8)    r8r6r;r9r:Úuint8ÚwhereÚemptyÚastype)    r<r6r>Úxport1Úxport2Úieee1ÚshiftÚieee2Úieees             r&Ú_parse_float_vecrWÅsd€ô
H‰HYÓ €EØ 8‰8˜%ˆ8Ó  €DØ $‰Z€FØ $‰Z€Fð ZÑ €Eô H‰H”S˜“X¤R§X¡XÔ .€EØ+,€EŒ"(‰(6˜JÑ&Ó
'Ñ(Ø+,€EŒ"(‰(6˜JÑ&Ó
'Ñ(Ø+,€EŒ"(‰(6˜JÑ&Ó
'Ñ(ð
ˆeO€EØ u‰_ &¨:Ñ"5¸2ÀÀUÁÑ;KÑ!LÑ M€Eð
ˆZÑ€Eð
6˜R‘< 4Ñ'¨2Ñ-°!Ñ3°uÑ<¸tÑCÈÑJؐÑññ€Eô 8‰8”S˜“ZM¨Ô 3€DØ€DˆJØ€DˆJØ 9‰9˜5ˆ9Ó !€DØ ;‰;tÓ €Dà €Kr0cóŠ—eZdZeZ                d                                     d d„Zd d„Zd„Zd d„Zdd„Z    dd„Z
ddd„Z d    „Z e e«ddd
„«Zy)Ú XportReaderNcóú—||_d|_||_||_t    |d|d|¬«|_|j
j |_    |j«y#t$r|j«‚wxYw)NrÚrbF)ÚencodingÚis_textÚ compression) Ú    _encodingÚ _lines_readÚ_indexÚ
_chunksizer    ÚhandlesÚhandleÚfilepath_or_bufferÚ _read_headerÚ    ExceptionÚclose)ÚselfreÚindexr\Ú    chunksizer^s      r&Ú__init__zXportReader.__init__s|€ð"ˆŒØˆÔ؈Œ Ø#ˆŒä!Ø Ø ØØØ#ô 
ˆŒ ð#'§,¡,×"5Ñ"5ˆÔð    Ø × Ñ Õ øÜò    Ø J‰JŒLØ ð    ús ÁAÁA:có8—|jj«y©N)rcrh©ris r&rhzXportReader.closes€Ø  ‰ ×ÑÕr0cóT—|jjd«j«S)NéP)reÚreadÚdecoderos r&Ú_get_rowzXportReader._get_row s"€Ø×&Ñ&×+Ñ+¨BÓ/×6Ñ6Ó8Ð8r0c
óä—|jjd«|j«}|tk7rd|vr t    d«‚t    d«‚|j«}ddgddgd    dgd
dgd d gg}t ||«}|dd k7r t    d«‚t |d «|d <||_|j«}t |dd «|d<|j«}|j«}|jt«}|tk(}    |r|    s t    d«‚t|dd«}
ddgddgddgddgd    dgd
dgd d gg} t |j«| «} dd gd
d gddgddgg} | jt |j«| ««t | d«| d<t | d «| d <| |_ dddœ} t|j«dd«}|
|z}|dzr |d|dzz
z }|jj|«}g}d}t|«|
k\rÉ|d|
||
d}}|j!d«}t#j$d|«}t't)t*|««}|d
=| |d |d <|d!}|d dk(r|d"ks|dkDrd#|›d$}t-|«‚|j/«D]\}}    |j1«||<Œ||d!z }||gz }t|«|
k\rŒÉ|j«}|t4k(s t    d%«‚||_||_|jj;«|_|j?«|_ |j6Dcgc]}|d&jC«‘Œc}|_"tG|j6«Dcgc]$\}}d'tI|«zd(tI|d!«zf‘Œ&}}}tKjL|«}||_'y#t2$rYŒ<wxYwcc}wcc}}w))Nrz**COMPRESSED**z<Header record indicates a CPORT file, which is not readable.z#Header record is not an XPORT file.ÚprefixrHÚversionr2ÚOSrÚcreatedézSAS     SAS     SASLIBz!Header record has invalid prefix.ÚmodifiedzMember header not foundéûÿÿÿéþÿÿÿÚset_nameÚsasdataré(ÚtypeÚnumericÚchar)rCrDé6é:rqéŒz>hhhh8s40s8shhh2s8shhl52srrrDzFloating field width z is not between 2 and 8.zObservation header not found.rr*r4)(reÚseekrtÚ_correct_line1r"r/r'Ú    file_infoÚ
startswithÚ_correct_header1Ú_correct_header2ÚintÚupdateÚ member_inforrr:ÚljustÚstructÚunpackÚdictÚzipÚ
_fieldkeysÚ    TypeErrorÚitemsr)ÚAttributeErrorÚ_correct_obs_headerÚfieldsÚ record_lengthÚtellÚ record_startÚ _record_countÚnobsrsÚcolumnsÚ    enumerateÚstrr8r6Ú_dtype)riÚline1Úline2Úfifr‰Úline3Úheader1Úheader2Ú    headflag1Ú    headflag2ÚfieldnamelengthÚmemrÚtypesÚ
fieldcountÚ
datalengthÚ    fielddataršÚ
obs_lengthÚ
fieldbytesÚ fieldstructÚfieldÚflÚmsgÚkÚvÚheaderÚxÚiÚdtypelr6s                               r&rfzXportReader._read_header#s[€Ø ×Ñ×$Ñ$ QÔ'ð— ‘ “ˆØ ”NÒ "Ø 5Ñ(ô!ØRóðôÐBÓCÐ Cà— ‘ “ˆØ˜"ˆ~     ¨1˜~°°a¨y¸3À¸)ÀiÐQSÀ_ÐUˆÜ  sÓ+ˆ    Ø XÑ Ð":Ò :ÜÐ@ÓAÐ AÜ*¨9°YÑ+?Ó@ˆ    )ÑØ"ˆŒà— ‘ “ˆÜ +¨E°#°2¨JÓ 7ˆ    *Ñð—-‘-“/ˆØ—-‘-“/ˆØ×&Ñ&Ô'7Ó8ˆ    ØÔ/Ñ/ˆ    Ù™iÜÐ6Ó7Ð 7ä˜g b¨˜nÓ-ˆðqˆMØ ˜ˆOØ ˜ˆNØ ˜ˆNØ 1ˆIØ "ˆIØ ˜ˆOð
ˆô" $§-¡-£/°3Ó7ˆ ؘBР# r ¨W°b¨M¸FÀA¸;ÐGˆØ×Ñœ; t§}¡}£¸Ó<Ô=Ü"-¨k¸*Ñ.EÓ"Fˆ JÑÜ!,¨[¸Ñ-CÓ!Dˆ IÑØ&ˆÔð &Ñ)ˆÜ˜Ÿ™›¨¨BÐ/Ó0ˆ
Ø$ zÑ1ˆ
à ˜Š?Ø ˜"˜z¨B™Ñ.Ñ .ˆJØ×+Ñ+×0Ñ0°Ó<ˆ    ØˆØˆ
ܐ)‹n Ò/ðÐ*˜?Ð+ؘ/Ð*Ð+ð"ˆJð$×)Ñ)¨#Ó.ˆJä Ÿ-™-Ð(CÀZÓPˆKÜœœZ¨Ó5Ó6ˆEؐc
Ø" 5¨¡>Ñ2ˆE'‰Nؐ~Ñ&ˆBؐW‰~ Ò*°°a²¸RÀ!ºVØ-¨b¨TÐ1IÐJÜ “nÐ$àŸ ™ › ò ‘1ðØ Ÿw™w›yE˜!’Hð ð ˜% Ñ/Ñ /ˆJØ ugÑ ˆFô7)‹n Ó/ð:—‘“ˆØÔ,Ò,ÜÐ<Ó=Ð =àˆŒ Ø'ˆÔØ ×3Ñ3×8Ñ8Ó:ˆÔà×&Ñ&Ó(ˆŒ    Ø48·K±KÖ@¨q˜˜&™    ×(Ñ(Õ*Ò@ˆŒ ô
& d§k¡kÓ2÷
ᐐ5ð”3q“6‰\˜3¤ U¨>Ñ%:Ó!;Ñ;Ò <ð
ˆñ
ô—‘˜Ó ˆØˆ øô/&òÚðüòAùó
sÊ.OÍO'Î)O,Ï    O$Ï#O$cóB—|j|jxsd¬«S)NrC©Únrows)rrrbros r&Ú__next__zXportReader.__next__‘s€Øy‰y˜tŸ™Ò3°!ˆyÓ4Ð4r0cóð—|jjdd«|jj«|jz
}|dzdk7rt    j
dt «¬«|jdkDr4|jj|j«||jzS|jjdd«|jjd«}tj|tj¬«}tj|dk(«}t|«dk(rd}nd    t|«z}|jj|j«||z
|jzS)
        Get number of records in file.
 
        This is maybe suboptimal because we have to seek to the end of
        the file.
 
        Side effect: returns file position to record_start.
        rrDrqzxport file may be corrupted.)Ú
stackleveli°ÿÿÿr5l  @@€r2)rer‡rœrÚwarningsÚwarnrr›rrr8Ú
frombufferÚuint64Ú flatnonzeror:)riÚtotal_records_lengthÚlast_card_bytesÚ    last_cardÚixÚtail_pads      r&ržzXportReader._record_count”s:€ð     ×Ñ×$Ñ$ Q¨Ô*Ø#×6Ñ6×;Ñ;Ó=À×@QÑ@QÑQÐà  "Ñ $¨Ò )Ü M‰MØ.Ü+Ó-õ ð
× Ñ  Ò "Ø × #Ñ #× (Ñ (¨×):Ñ):Ô ;Ø'¨4×+=Ñ+=Ñ=Ð =à ×Ñ×$Ñ$ S¨!Ô,Ø×1Ñ1×6Ñ6°rÓ:ˆÜ—M‘M /¼¿¹ÔCˆ    ô^‰^˜IÐ)<Ñ<Ó =ˆä ˆr‹7aŠ<؉Hàœ3˜r›7‘{ˆHà ×Ñ×$Ñ$ T×%6Ñ%6Ô7à$ xÑ/°D×4FÑ4FÑFÐFr0cóB—|€ |j}|j|¬«S)a
        Reads lines from Xport file and returns as dataframe
 
        Parameters
        ----------
        size : int, defaults to None
            Number of lines to read.  If None, reads whole file.
 
        Returns
        -------
        DataFrame
        r¿)rbrr)riÚsizes  r&Ú    get_chunkzXportReader.get_chunkºs#€ð ˆ<Ø—?‘?ˆD؏y‰y˜tˆyÓ$Ð$r0có®—|jd¬«}|ddk(|ddk(z|ddk(z}|ddk\|dd    kz|dd
k(z|dd k(z}||z}|S) Nz u1,u1,u2,u4r5rBrÚf2Úf3r7rJéZé_é.)r;)rir<r¹ÚmissÚmiss1s     r&Ú_missing_doublezXportReader._missing_doubleËs†€Ø H‰H˜=ˆHÓ )ˆØ$‘˜1‘   4¡¨A¡Ñ.°!°D±'¸Q±,Ñ?ˆà‰g˜‰o ! D¡'¨T¡/Ñ 2ؐ‰w˜$‰ñ  à‰w˜$‰ñ  ð    ð
     ‰ ˆØˆ r0có|—|€ |j}t||j|jz
«}||jz}|dkr|j    «t
‚|j j|«}tj||j|¬«}i}t|j«D]ò\}}|dt|«z}    |j|d}
|
dk(rLt|    |j|d«}    |j!|    «} t#|    «} tj$| | <nf|j|ddk(rQ|    D cgc]} | j'«‘Œ} } |j((| D cgc]} | j+|j(«‘Œ} } |j-| i«Œôt/j0|«}|j2€<t/j4t7|j|j|z««|_n|j;|j2«}|xj|z c_|Scc} wcc} w)Nr)r6Úcountr*rr‚rrƒ)rŸÚminr`r›rhÚ StopIterationrerrr8rÆr£r¡r r¢ršr@rÙrWÚnanÚrstripr_rsrŽr#Ú    DataFrameraÚIndexÚrangerjÚ    set_index)rirÀÚ
read_linesÚread_lenÚrawÚdataÚdf_dataÚjr»r<rr×r¹ÚyÚdfs               r&rrzXportReader.readÖsæ€à ˆ=Ø—I‘IˆE䘠§    ¡    ¨D×,<Ñ,<Ñ <Ó=ˆ
Ø × 2Ñ 2Ñ2ˆØ qŠ=Ø J‰JŒLÜÐ Ø×%Ñ%×*Ñ*¨8Ó4ˆÜ}‰}˜S¨¯ © ¸:ÔFˆàˆÜ˜dŸl™lÓ+ò    #‰DˆAˆqؐsœS ›V‘|Ñ$ˆCØ—K‘K ‘N 7Ñ+ˆEؘ    Ò!Ü1°#°t·{±{À1±~ÀnÑ7UÓVØ×+Ñ+¨CÓ0Ü$ SÓ)ÜŸ&™&$’Ø—‘˜Q‘ Ñ(¨FÒ2Ø),Ö- AQ—X‘X•ZÐ-Ð-à—>‘>Ð-Ø;<Ö=°a˜Ÿ™ $§.¡.Õ1Ð=AÐ=à N‰N˜A˜q˜6Õ "ð    #ô\‰\˜'Ó "ˆà ;‰;Ð Ü—x‘x¤ d×&6Ñ&6¸×8HÑ8HÈ:Ñ8UÓ VÓWˆBHà—‘˜dŸk™kÓ*ˆBà ×Ò˜JÑ&Õàˆ    ùò.ùò>s ÅH4Å,"H9)Nz
ISO-8859-1NÚinfer)
rezFilePath | ReadBuffer[bytes]r\z
str | Nonerkú
int | Noner^r ÚreturnÚNone)rîrï)rîú pd.DataFrame)rîrrn)rÏrírîrð)rÀrírîrð)Ú__name__Ú
__module__Ú __qualname__Ú_xport_reader_docÚ__doc__rlrhrtrfrÁržrÐrÙrÚ_read_method_docrr©r0r&rYrYþs‹„Ø€Gð
Ø+Ø $Ø*1ð à8ððð    ð
ð ð (ð ð
óó8ò9óló\5ó$GôL%ò"    ñÐÓó%ó ñ%r0rY)r%r¢rîr )r*r¢)-rõÚ
__future__rÚ collectionsrrr‘ÚtypingrrÄÚnumpyr8Úpandas.util._decoratorsrÚpandas.util._exceptionsrÚpandasr#Úpandas.io.commonr    Úpandas.io.sas.sasreaderr
Úpandas._typingr r r rrˆr‹rŒr™r•Ú_base_params_docÚ _params2_docÚ_format_params_docÚ _iterator_docÚ _read_sas_docrôrör'r/r@rWÚIteratorrYr÷r0r&ú<module>rsðñõ#åÝÛ Ý Ûãå,Ý4ãå'Ý.á÷óð'ðð
Rðð'ðð
'ðò€
ð(CÐð @€ ð9ÐðA€ ð
àÐðØÐðØ €ðØ€ðð € ð2ðÐðØ €ðð     Ðð Ðóóò,ò&6ôr~*˜cŸl™lõ~r0