Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python sas7bdat module usage

Tags:

python

sas

I have to dump data from SAS datasets. I found a Python module called sas7bdat.py that says it can read SAS .sas7bdat datasets, and I think it would be simpler and more straightforward to do the project in Python rather than SAS due to the other functionality required. However, the help(sas7bdat) in interactive Python is not very useful and the only example I was able to find to dump a dataset is as follows:

import sas7bdat
from sas7bdat import *
# following line is sas dataset to convert
foo = SAS7BDAT('/support/sas/locked_data.sas7bdat')
#following line is txt file to create
foo.convertFile('/support/textfiles/locked_data.txt','\t')

This doesn't do what I want because a) it uses the SAS variable names as column headers and I need it to use the variable labels, and b) it uses "nan" to denote missing numeric values where I'd rather just leave the value blank.

Can anyone point me to some useful documentation on the methods included in sas7bdat.py? I've Googled every permutation of key words that I could think of, with no luck. If not, can someone give me an example or two of using readColumnAttributes(), readColumnLabels(), and/or readColumnNames()?

Thanks, all.

like image 200
at_sea Avatar asked Oct 28 '13 21:10

at_sea


People also ask

Can Python read sas7bdat?

sas7bdat.pyThis module will read sas7bdat files using pure Python (2.6+, 3+). No SAS software required! The module started out as a port of the R script of the same name found here: https://github.com/BioStatMatt/sas7bdat but has since been completely rewritten.

How do I run sas7bdat?

sas7bdat is already a SAS dataset file, there is no need to import it. You (only) have to put it into a directory where SAS has access to, and define a libname for that directory. After that, the dataset can be used in a set/merge statement, or in a data= option in a proc statement, or in proc sql.

What is sas7bdat file?

SAS7BDAT files consist of binary encoded data. Data files encoded in this format often have the extension '. sas7bdat'. The name 'SAS7BDAT' is not official, but is used throughout this document to refer to SAS database files formatted according to the descriptions below.

Can Python output a SAS dataset?

In addition, Python provides useful modules to enable users to access and handle SAS datasets and utilize SAS modules from Python via SASPy modules (Nakajima 2018). These functionalities are very useful for users to learn and utilize both the functionalities of SAS and Python to analyze the data more efficiently.


2 Answers

As time passes, solutions become easier. I think this one is easiest if you want to work with pandas:

import pandas as pd
df = pd.read_sas('/support/sas/locked_data.sas7bdat')

Note that it is easy to get a numpy array by using df.values

like image 139
Guido Avatar answered Sep 23 '22 02:09

Guido


This is only a partial answer as I've found no [easy to read] concrete documentation.

You can view the source code here

This shows some basic info regarding what arguments the methods require, such as:

  • readColumnAttributes(self, colattr)
  • readColumnLabels(self, collabs, coltext, colcount)
  • readColumnNames(self, colname, coltext)

I think most of what you are after is stored in the "header" class returned when creating an object with SAS7BDAT. If you just print that class you'll get a lot of info, but you can also access class attributes as well. I think most of what you may be looking for would be under foo.header.cols. I suspect you use various header attributes as parameters for the methods you mention.

Maybe something like this will get you closer?

from sas7bdat import SAS7BDAT
foo = SAS7BDAT(inFile) #your file here...

for i in foo.header.cols:
    print '"Atrributes"', i.attr
    print '"Labels"', i.label
    print '"Name"', i.name

edit: Unrelated to this specific question, but the type() and dir() commands come in handy when trying to figure out what is going on in an unfamiliar class/library

like image 31
Richard W Avatar answered Sep 25 '22 02:09

Richard W