{"action":"created","comment":{"url":"https://api.github.com/repos/pydata/pandas/pulls/comments/33406915","id":33406915,"diff_hunk":"@@ -0,0 +1,457 @@\n+\"\"\"\n+Tools for reading SAS XPort files into Pandas objects.\n+\n+Based on code from Jack Cushman (github.com/jcushman/xport).\n+\n+The file format is defined here:\n+\n+https://support.sas.com/techsup/technote/ts140.pdf\n+\"\"\"\n+\n+from datetime import datetime\n+import pandas as pd\n+from pandas.io.common import get_filepath_or_buffer\n+from pandas import compat\n+import struct\n+import numpy as np\n+from pandas.util.decorators import Appender\n+\n+_correct_line1 = \"HEADER RECORD*******LIBRARY HEADER RECORD!!!!!!!000000000000000000000000000000  \"\n+_correct_header1 = \"HEADER RECORD*******MEMBER  HEADER RECORD!!!!!!!000000000000000001600000000\"\n+_correct_header2 = \"HEADER RECORD*******DSCRPTR HEADER RECORD!!!!!!!000000000000000000000000000000  \"\n+_correct_obs_header = \"HEADER RECORD*******OBS     HEADER RECORD!!!!!!!000000000000000000000000000000  \"\n+_fieldkeys = ['ntype', 'nhfun', 'field_length', 'nvar0', 'name', 'label',\n+              'nform', 'nfl', 'num_decimals', 'nfj', 'nfill', 'niform',\n+              'nifl', 'nifd', 'npos', '_']\n+\n+\n+# TODO: Support for 4 byte floats, see https://github.com/jcushman/xport/pull/3\n+# Need a test file\n+\n+\n+_base_params_doc = \"\"\"\\\n+Parameters\n+----------\n+filepath_or_buffer : string or file-like object\n+    Path to SAS file or object implementing binary read method.\"\"\"\n+\n+_params2_doc = \"\"\"\\\n+index : identifier of index column\n+    Identifier of column that should be used as index of the DataFrame.\n+encoding : string\n+    Encoding for text data.\n+chunksize : int\n+    Read file `chunksize` lines at a time, returns iterator.\"\"\"\n+\n+_format_params_doc = \"\"\"\\\n+format : string\n+    File format, only `xport` is currently supported.\"\"\"\n+\n+_iterator_doc = \"\"\"\\\n+iterator : boolean, default False\n+    Return XportReader object for reading file incrementally.\"\"\"\n+\n+\n+_read_sas_doc = \"\"\"Read a SAS file into a DataFrame.\n+\n+%(_base_params_doc)s\n+%(_format_params_doc)s\n+%(_params2_doc)s\n+%(_iterator_doc)s\n+\n+Returns\n+-------\n+DataFrame or XportReader\n+\n+Examples\n+--------\n+Read a SAS Xport file:\n+\n+>>> df = pandas.read_sas('filename.XPT')\n+\n+Read a Xport file in 10,000 line chunks:\n+\n+>>> itr = pandas.read_sas('filename.XPT', chunksize=10000)\n+>>> for chunk in itr:\n+>>>     do_something(chunk)\n+\n+.. versionadded:: 0.17.0\n+\"\"\" % {\"_base_params_doc\": _base_params_doc,\n+       \"_format_params_doc\": _format_params_doc,\n+       \"_params2_doc\": _params2_doc,\n+       \"_iterator_doc\": _iterator_doc}\n+\n+\n+_xport_reader_doc = \"\"\"\\\n+Class for reading SAS Xport files.\n+\n+%(_base_params_doc)s\n+%(_params2_doc)s\n+\n+Attributes\n+----------\n+member_info : list\n+    Contains information about the file\n+fields : list\n+    Contains information about the variables in the file\n+\"\"\" % {\"_base_params_doc\": _base_params_doc,\n+       \"_params2_doc\": _params2_doc}\n+\n+\n+_read_method_doc = \"\"\"\\\n+Read observations from SAS Xport file, returning as data frame.\n+\n+Parameters\n+----------\n+nrows : int\n+    Number of rows to read from data file; if None, read whole\n+    file.\n+\n+Returns\n+-------\n+A DataFrame.\n+\"\"\"\n+\n+\n+@Appender(_read_sas_doc)\n+def read_sas(filepath_or_buffer, format='xport', index=None, encoding='ISO-8859-1',\n+             chunksize=None, iterator=False):\n+\n+    if format.lower() != 'xport':\n+        raise ValueError('only xport format is supported')\n+\n+    reader = XportReader(filepath_or_buffer, index=index, encoding=encoding,\n+                         chunksize=chunksize)\n+\n+    if iterator or chunksize:\n+        return reader\n+\n+    return reader.read()\n+\n+\n+def _parse_date(datestr):\n+    \"\"\" Given a date in xport format, return Python date. \"\"\"\n+    try:\n+        return datetime.strptime(datestr, \"%d%b%y:%H:%M:%S\") # e.g. \"16FEB11:10:07:55\"\n+    except ValueError:\n+        return pd.NaT\n+\n+\n+def _split_line(s, parts):\n+    \"\"\"\n+    Parameters\n+    ----------\n+    s: string\n+        Fixed-length string to split\n+    parts: list of (name, length) pairs\n+        Used to break up string, name '_' will be filtered from output.\n+\n+    Returns\n+    -------\n+    Dict of name:contents of string at given location.\n+    \"\"\"\n+    out = {}\n+    start = 0\n+    for name, length in parts:\n+        out[name] = s[start:start+length].strip()\n+        start += length\n+    del out['_']\n+    return out\n+\n+\n+def _parse_float_vec(vec):\n+    \"\"\"\n+    Parse a vector of 8-byte values representing IBM 8 byte floats\n+    into native 8 byte floats.\n+    \"\"\"\n+\n+    dtype = np.dtype('>u4,>u4')\n+    vec1 = vec.view(dtype=dtype)\n+\n+    xport1 = vec1['f0']\n+    xport2 = vec1['f1']\n+\n+    # Start by setting first half of ieee number to first half of IBM\n+    # number sans exponent\n+    ieee1 = xport1 & 0x00ffffff\n+\n+    # Get the second half of the ibm number into the second half of\n+    # the ieee number\n+    ieee2 = xport2\n+\n+    # The fraction bit to the left of the binary point in the ieee\n+    # format was set and the number was shifted 0, 1, 2, or 3\n+    # places. This will tell us how to adjust the ibm exponent to be a\n+    # power of 2 ieee exponent and how to shift the fraction bits to\n+    # restore the correct magnitude.\n+    shift = np.zeros(len(vec), dtype=np.uint8)\n+    shift[np.where(xport1 & 0x00200000)] = 1\n+    shift[np.where(xport1 & 0x00400000)] = 2\n+    shift[np.where(xport1 & 0x00800000)] = 3\n+\n+    # shift the ieee number down the correct number of places then\n+    # set the second half of the ieee number to be the second half\n+    # of the ibm number shifted appropriately, ored with the bits\n+    # from the first half that would have been shifted in if we\n+    # could shift a double. All we are worried about are the low\n+    # order 3 bits of the first half since we're only shifting by\n+    # 1, 2, or 3.\n+    ieee1 >>= shift\n+    ieee2 = (xport2 >> shift) | ((xport1 & 0x00000007) << (29 + (3 - shift)))\n+\n+    # clear the 1 bit to the left of the binary point\n+    ieee1 &= 0xffefffff\n+\n+    # set the exponent of the ieee number to be the actual exponent\n+    # plus the shift count + 1023. Or this into the first half of the\n+    # ieee number. The ibm exponent is excess 64 but is adjusted by 65\n+    # since during conversion to ibm format the exponent is\n+    # incremented by 1 and the fraction bits left 4 positions to the\n+    # right of the radix point.  (had to add >> 24 because C treats &\n+    # 0x7f as 0x7f000000 and Python doesn't)\n+    ieee1 |= ((((((xport1 >> 24) & 0x7f) - 65) << 2) + shift + 1023) << 20) | (xport1 & 0x80000000)\n+\n+    ieee = np.empty((len(ieee1),), dtype='>u4,>u4')\n+    ieee['f0'] = ieee1\n+    ieee['f1'] = ieee2\n+    ieee = ieee.view(dtype='>f8')\n+    ieee = ieee.astype('f8')\n+\n+    return ieee\n+\n+\n+\n+class XportReader(object):\n+    __doc__ = _xport_reader_doc\n+\n+\n+    def __init__(self, filepath_or_buffer, index=None, encoding='ISO-8859-1',\n+                 chunksize=None):\n+\n+        self._encoding = encoding\n+        self._lines_read = 0\n+        self._index = index\n+        self._chunksize = chunksize\n+\n+        if isinstance(filepath_or_buffer, str):\n+            filepath_or_buffer, encoding = get_filepath_or_buffer(\n+                filepath_or_buffer, encoding=encoding)\n+\n+        if isinstance(filepath_or_buffer, (str, compat.text_type, bytes)):\n+            self.filepath_or_buffer = open(filepath_or_buffer, 'rb')\n+        else:\n+            # Copy to BytesIO, and ensure no encoding\n+            contents = filepath_or_buffer.read()\n+            try:\n+                contents = contents.encode(self._encoding)\n+            except:\n+                pass\n+            self.filepath_or_buffer = compat.BytesIO(contents)\n+\n+        self._read_header()\n+\n+\n+    def _get_row(self):\n+        return self.filepath_or_buffer.read(80).decode()\n+\n+\n+    def _read_header(self):\n+        self.filepath_or_buffer.seek(0)\n+\n+        # read file header\n+        line1 = self._get_row()\n+        if line1 != _correct_line1:\n+            raise Exception(\"Header record is not an XPORT file.\")","path":"pandas/io/sas.py","position":264,"original_position":264,"commit_id":"12c1f97a541e7ff826a1e49ee946e0e23882c033","original_commit_id":"12c1f97a541e7ff826a1e49ee946e0e23882c033","user":{"login":"jreback","id":953992,"avatar_url":"https://avatars.githubusercontent.com/u/953992?v=3","gravatar_id":"","url":"https://api.github.com/users/jreback","html_url":"https://github.com/jreback","followers_url":"https://api.github.com/users/jreback/followers","following_url":"https://api.github.com/users/jreback/following{/other_user}","gists_url":"https://api.github.com/users/jreback/gists{/gist_id}","starred_url":"https://api.github.com/users/jreback/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jreback/subscriptions","organizations_url":"https://api.github.com/users/jreback/orgs","repos_url":"https://api.github.com/users/jreback/repos","events_url":"https://api.github.com/users/jreback/events{/privacy}","received_events_url":"https://api.github.com/users/jreback/received_events","type":"User","site_admin":false},"body":"use ``ValueError`` rather than ``Exception`` (same below)","created_at":"2015-06-27T00:37:21Z","updated_at":"2015-06-27T00:37:21Z","html_url":"https://github.com/pydata/pandas/pull/9711#discussion_r33406915","pull_request_url":"https://api.github.com/repos/pydata/pandas/pulls/9711","_links":{"self":{"href":"https://api.github.com/repos/pydata/pandas/pulls/comments/33406915"},"html":{"href":"https://github.com/pydata/pandas/pull/9711#discussion_r33406915"},"pull_request":{"href":"https://api.github.com/repos/pydata/pandas/pulls/9711"}}},"pull_request":{"url":"https://api.github.com/repos/pydata/pandas/pulls/9711","id":31732727,"html_url":"https://github.com/pydata/pandas/pull/9711","diff_url":"https://github.com/pydata/pandas/pull/9711.diff","patch_url":"https://github.com/pydata/pandas/pull/9711.patch","issue_url":"https://api.github.com/repos/pydata/pandas/issues/9711","number":9711,"state":"open","locked":false,"title":"SAS xport file reader","user":{"login":"kshedden","id":2666691,"avatar_url":"https://avatars.githubusercontent.com/u/2666691?v=3","gravatar_id":"","url":"https://api.github.com/users/kshedden","html_url":"https://github.com/kshedden","followers_url":"https://api.github.com/users/kshedden/followers","following_url":"https://api.github.com/users/kshedden/following{/other_user}","gists_url":"https://api.github.com/users/kshedden/gists{/gist_id}","starred_url":"https://api.github.com/users/kshedden/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kshedden/subscriptions","organizations_url":"https://api.github.com/users/kshedden/orgs","repos_url":"https://api.github.com/users/kshedden/repos","events_url":"https://api.github.com/users/kshedden/events{/privacy}","received_events_url":"https://api.github.com/users/kshedden/received_events","type":"User","site_admin":false},"body":"Here is an initial attempt to port Jack Cushman's xport file reader into Pandas.\r\n\r\nPartially addresses #4052 (but this only deals with xport files, not sas7bdat files)","created_at":"2015-03-23T13:45:08Z","updated_at":"2015-06-27T00:37:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fad239de119506b78272ae612a2947f215aed11d","assignee":null,"milestone":{"url":"https://api.github.com/repos/pydata/pandas/milestones/34","html_url":"https://github.com/pydata/pandas/milestones/0.17.0","labels_url":"https://api.github.com/repos/pydata/pandas/milestones/34/labels","id":1033710,"number":34,"title":"0.17.0","description":"","creator":{"login":"jreback","id":953992,"avatar_url":"https://avatars.githubusercontent.com/u/953992?v=3","gravatar_id":"","url":"https://api.github.com/users/jreback","html_url":"https://github.com/jreback","followers_url":"https://api.github.com/users/jreback/followers","following_url":"https://api.github.com/users/jreback/following{/other_user}","gists_url":"https://api.github.com/users/jreback/gists{/gist_id}","starred_url":"https://api.github.com/users/jreback/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jreback/subscriptions","organizations_url":"https://api.github.com/users/jreback/orgs","repos_url":"https://api.github.com/users/jreback/repos","events_url":"https://api.github.com/users/jreback/events{/privacy}","received_events_url":"https://api.github.com/users/jreback/received_events","type":"User","site_admin":false},"open_issues":168,"closed_issues":48,"state":"open","created_at":"2015-03-23T10:47:38Z","updated_at":"2015-06-26T23:29:51Z","due_on":"2015-07-31T04:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/pydata/pandas/pulls/9711/commits","review_comments_url":"https://api.github.com/repos/pydata/pandas/pulls/9711/comments","review_comment_url":"https://api.github.com/repos/pydata/pandas/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pydata/pandas/issues/9711/comments","statuses_url":"https://api.github.com/repos/pydata/pandas/statuses/12c1f97a541e7ff826a1e49ee946e0e23882c033","head":{"label":"kshedden:sas_xport","ref":"sas_xport","sha":"12c1f97a541e7ff826a1e49ee946e0e23882c033","user":{"login":"kshedden","id":2666691,"avatar_url":"https://avatars.githubusercontent.com/u/2666691?v=3","gravatar_id":"","url":"https://api.github.com/users/kshedden","html_url":"https://github.com/kshedden","followers_url":"https://api.github.com/users/kshedden/followers","following_url":"https://api.github.com/users/kshedden/following{/other_user}","gists_url":"https://api.github.com/users/kshedden/gists{/gist_id}","starred_url":"https://api.github.com/users/kshedden/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kshedden/subscriptions","organizations_url":"https://api.github.com/users/kshedden/orgs","repos_url":"https://api.github.com/users/kshedden/repos","events_url":"https://api.github.com/users/kshedden/events{/privacy}","received_events_url":"https://api.github.com/users/kshedden/received_events","type":"User","site_admin":false},"repo":{"id":30704378,"name":"pandas","full_name":"kshedden/pandas","owner":{"login":"kshedden","id":2666691,"avatar_url":"https://avatars.githubusercontent.com/u/2666691?v=3","gravatar_id":"","url":"https://api.github.com/users/kshedden","html_url":"https://github.com/kshedden","followers_url":"https://api.github.com/users/kshedden/followers","following_url":"https://api.github.com/users/kshedden/following{/other_user}","gists_url":"https://api.github.com/users/kshedden/gists{/gist_id}","starred_url":"https://api.github.com/users/kshedden/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kshedden/subscriptions","organizations_url":"https://api.github.com/users/kshedden/orgs","repos_url":"https://api.github.com/users/kshedden/repos","events_url":"https://api.github.com/users/kshedden/events{/privacy}","received_events_url":"https://api.github.com/users/kshedden/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kshedden/pandas","description":"Flexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more","fork":true,"url":"https://api.github.com/repos/kshedden/pandas","forks_url":"https://api.github.com/repos/kshedden/pandas/forks","keys_url":"https://api.github.com/repos/kshedden/pandas/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kshedden/pandas/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kshedden/pandas/teams","hooks_url":"https://api.github.com/repos/kshedden/pandas/hooks","issue_events_url":"https://api.github.com/repos/kshedden/pandas/issues/events{/number}","events_url":"https://api.github.com/repos/kshedden/pandas/events","assignees_url":"https://api.github.com/repos/kshedden/pandas/assignees{/user}","branches_url":"https://api.github.com/repos/kshedden/pandas/branches{/branch}","tags_url":"https://api.github.com/repos/kshedden/pandas/tags","blobs_url":"https://api.github.com/repos/kshedden/pandas/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kshedden/pandas/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kshedden/pandas/git/refs{/sha}","trees_url":"https://api.github.com/repos/kshedden/pandas/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kshedden/pandas/statuses/{sha}","languages_url":"https://api.github.com/repos/kshedden/pandas/languages","stargazers_url":"https://api.github.com/repos/kshedden/pandas/stargazers","contributors_url":"https://api.github.com/repos/kshedden/pandas/contributors","subscribers_url":"https://api.github.com/repos/kshedden/pandas/subscribers","subscription_url":"https://api.github.com/repos/kshedden/pandas/subscription","commits_url":"https://api.github.com/repos/kshedden/pandas/commits{/sha}","git_commits_url":"https://api.github.com/repos/kshedden/pandas/git/commits{/sha}","comments_url":"https://api.github.com/repos/kshedden/pandas/comments{/number}","issue_comment_url":"https://api.github.com/repos/kshedden/pandas/issues/comments{/number}","contents_url":"https://api.github.com/repos/kshedden/pandas/contents/{+path}","compare_url":"https://api.github.com/repos/kshedden/pandas/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kshedden/pandas/merges","archive_url":"https://api.github.com/repos/kshedden/pandas/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kshedden/pandas/downloads","issues_url":"https://api.github.com/repos/kshedden/pandas/issues{/number}","pulls_url":"https://api.github.com/repos/kshedden/pandas/pulls{/number}","milestones_url":"https://api.github.com/repos/kshedden/pandas/milestones{/number}","notifications_url":"https://api.github.com/repos/kshedden/pandas/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kshedden/pandas/labels{/name}","releases_url":"https://api.github.com/repos/kshedden/pandas/releases{/id}","created_at":"2015-02-12T13:46:00Z","updated_at":"2015-04-03T12:35:08Z","pushed_at":"2015-06-18T15:38:11Z","git_url":"git://github.com/kshedden/pandas.git","ssh_url":"git@github.com:kshedden/pandas.git","clone_url":"https://github.com/kshedden/pandas.git","svn_url":"https://github.com/kshedden/pandas","homepage":"http://pandas.pydata.org","size":54681,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"pydata:master","ref":"master","sha":"af3c3a37e19b12df4aa2bd4a1f1a060b80edc403","user":{"login":"pydata","id":1284191,"avatar_url":"https://avatars.githubusercontent.com/u/1284191?v=3","gravatar_id":"","url":"https://api.github.com/users/pydata","html_url":"https://github.com/pydata","followers_url":"https://api.github.com/users/pydata/followers","following_url":"https://api.github.com/users/pydata/following{/other_user}","gists_url":"https://api.github.com/users/pydata/gists{/gist_id}","starred_url":"https://api.github.com/users/pydata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pydata/subscriptions","organizations_url":"https://api.github.com/users/pydata/orgs","repos_url":"https://api.github.com/users/pydata/repos","events_url":"https://api.github.com/users/pydata/events{/privacy}","received_events_url":"https://api.github.com/users/pydata/received_events","type":"Organization","site_admin":false},"repo":{"id":858127,"name":"pandas","full_name":"pydata/pandas","owner":{"login":"pydata","id":1284191,"avatar_url":"https://avatars.githubusercontent.com/u/1284191?v=3","gravatar_id":"","url":"https://api.github.com/users/pydata","html_url":"https://github.com/pydata","followers_url":"https://api.github.com/users/pydata/followers","following_url":"https://api.github.com/users/pydata/following{/other_user}","gists_url":"https://api.github.com/users/pydata/gists{/gist_id}","starred_url":"https://api.github.com/users/pydata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pydata/subscriptions","organizations_url":"https://api.github.com/users/pydata/orgs","repos_url":"https://api.github.com/users/pydata/repos","events_url":"https://api.github.com/users/pydata/events{/privacy}","received_events_url":"https://api.github.com/users/pydata/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/pydata/pandas","description":"Flexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more","fork":false,"url":"https://api.github.com/repos/pydata/pandas","forks_url":"https://api.github.com/repos/pydata/pandas/forks","keys_url":"https://api.github.com/repos/pydata/pandas/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pydata/pandas/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pydata/pandas/teams","hooks_url":"https://api.github.com/repos/pydata/pandas/hooks","issue_events_url":"https://api.github.com/repos/pydata/pandas/issues/events{/number}","events_url":"https://api.github.com/repos/pydata/pandas/events","assignees_url":"https://api.github.com/repos/pydata/pandas/assignees{/user}","branches_url":"https://api.github.com/repos/pydata/pandas/branches{/branch}","tags_url":"https://api.github.com/repos/pydata/pandas/tags","blobs_url":"https://api.github.com/repos/pydata/pandas/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pydata/pandas/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pydata/pandas/git/refs{/sha}","trees_url":"https://api.github.com/repos/pydata/pandas/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pydata/pandas/statuses/{sha}","languages_url":"https://api.github.com/repos/pydata/pandas/languages","stargazers_url":"https://api.github.com/repos/pydata/pandas/stargazers","contributors_url":"https://api.github.com/repos/pydata/pandas/contributors","subscribers_url":"https://api.github.com/repos/pydata/pandas/subscribers","subscription_url":"https://api.github.com/repos/pydata/pandas/subscription","commits_url":"https://api.github.com/repos/pydata/pandas/commits{/sha}","git_commits_url":"https://api.github.com/repos/pydata/pandas/git/commits{/sha}","comments_url":"https://api.github.com/repos/pydata/pandas/comments{/number}","issue_comment_url":"https://api.github.com/repos/pydata/pandas/issues/comments{/number}","contents_url":"https://api.github.com/repos/pydata/pandas/contents/{+path}","compare_url":"https://api.github.com/repos/pydata/pandas/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pydata/pandas/merges","archive_url":"https://api.github.com/repos/pydata/pandas/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pydata/pandas/downloads","issues_url":"https://api.github.com/repos/pydata/pandas/issues{/number}","pulls_url":"https://api.github.com/repos/pydata/pandas/pulls{/number}","milestones_url":"https://api.github.com/repos/pydata/pandas/milestones{/number}","notifications_url":"https://api.github.com/repos/pydata/pandas/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pydata/pandas/labels{/name}","releases_url":"https://api.github.com/repos/pydata/pandas/releases{/id}","created_at":"2010-08-24T01:37:33Z","updated_at":"2015-06-26T20:08:39Z","pushed_at":"2015-06-26T23:29:27Z","git_url":"git://github.com/pydata/pandas.git","ssh_url":"git@github.com:pydata/pandas.git","clone_url":"https://github.com/pydata/pandas.git","svn_url":"https://github.com/pydata/pandas","homepage":"http://pandas.pydata.org","size":146770,"stargazers_count":4577,"watchers_count":4577,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1717,"mirror_url":null,"open_issues_count":1445,"forks":1717,"open_issues":1445,"watchers":4577,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/pydata/pandas/pulls/9711"},"html":{"href":"https://github.com/pydata/pandas/pull/9711"},"issue":{"href":"https://api.github.com/repos/pydata/pandas/issues/9711"},"comments":{"href":"https://api.github.com/repos/pydata/pandas/issues/9711/comments"},"review_comments":{"href":"https://api.github.com/repos/pydata/pandas/pulls/9711/comments"},"review_comment":{"href":"https://api.github.com/repos/pydata/pandas/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pydata/pandas/pulls/9711/commits"},"statuses":{"href":"https://api.github.com/repos/pydata/pandas/statuses/12c1f97a541e7ff826a1e49ee946e0e23882c033"}}}}