{"action":"created","comment":{"url":"https://api.github.com/repos/pandas-dev/pandas/pulls/comments/361709989","pull_request_review_id":336827863,"id":361709989,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDM2MTcwOTk4OQ==","diff_hunk":"@@ -97,6 +97,38 @@ def _handle_date_column(col, utc=None, format=None):\n             return to_datetime(col, errors=\"coerce\", format=format, utc=utc)\n \n \n+def _is_datetime_series_with_different_offsets(df_col):","path":"pandas/io/sql.py","position":4,"original_position":4,"commit_id":"baf1fdf33e7bf74ced3ddadf36a169c7c2cf2043","original_commit_id":"66ebe355c9c080536574ad8c5f0a4a3cb5e5be6b","user":{"login":"jreback","id":953992,"node_id":"MDQ6VXNlcjk1Mzk5Mg==","avatar_url":"https://avatars2.githubusercontent.com/u/953992?v=4","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":"i would rather infer_dryoe return a new type (option 1)\r\n\r\nwe have extensive test coverage in this routine so adding this would be ok","created_at":"2019-12-27T17:24:41Z","updated_at":"2019-12-27T17:24:41Z","html_url":"https://github.com/pandas-dev/pandas/pull/30492#discussion_r361709989","pull_request_url":"https://api.github.com/repos/pandas-dev/pandas/pulls/30492","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/pandas-dev/pandas/pulls/comments/361709989"},"html":{"href":"https://github.com/pandas-dev/pandas/pull/30492#discussion_r361709989"},"pull_request":{"href":"https://api.github.com/repos/pandas-dev/pandas/pulls/30492"}},"in_reply_to_id":361540051},"pull_request":{"url":"https://api.github.com/repos/pandas-dev/pandas/pulls/30492","id":357056599,"node_id":"MDExOlB1bGxSZXF1ZXN0MzU3MDU2NTk5","html_url":"https://github.com/pandas-dev/pandas/pull/30492","diff_url":"https://github.com/pandas-dev/pandas/pull/30492.diff","patch_url":"https://github.com/pandas-dev/pandas/pull/30492.patch","issue_url":"https://api.github.com/repos/pandas-dev/pandas/issues/30492","number":30492,"state":"open","locked":false,"title":"Bugfix sql different offsets","user":{"login":"ThibTrip","id":40694343,"node_id":"MDQ6VXNlcjQwNjk0MzQz","avatar_url":"https://avatars2.githubusercontent.com/u/40694343?v=4","gravatar_id":"","url":"https://api.github.com/users/ThibTrip","html_url":"https://github.com/ThibTrip","followers_url":"https://api.github.com/users/ThibTrip/followers","following_url":"https://api.github.com/users/ThibTrip/following{/other_user}","gists_url":"https://api.github.com/users/ThibTrip/gists{/gist_id}","starred_url":"https://api.github.com/users/ThibTrip/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ThibTrip/subscriptions","organizations_url":"https://api.github.com/users/ThibTrip/orgs","repos_url":"https://api.github.com/users/ThibTrip/repos","events_url":"https://api.github.com/users/ThibTrip/events{/privacy}","received_events_url":"https://api.github.com/users/ThibTrip/received_events","type":"User","site_admin":false},"body":"- [x] closes #30207\r\n- [ ] tests added / passed\r\n- [x] passes `black pandas`\r\n- [x] passes `git diff upstream/master -u -- \"*.py\" | flake8 --diff`\r\n- [ ] whatsnew entry\r\n\r\n# Explanations\r\n\r\nFor to_sql no errors are raised anymore when we have Series containing datetimes with timezone and different offsets (unlike in GH30207) and the data is saved as expected (I tested with postgres which does not save offsets anyways).\r\n\r\nConcerning read_sql however there are several points to discuss:\r\n\r\n1. if we want to have datetime64 instead of \"object\" (as described in [GH30207](https://github.com/pandas-dev/pandas/issues/30207)) we lose the offsets. So this would be a breaking change and would require first a warning in the next version then we implement it in the version after, right?\r\n\r\n2. is this patch I made acceptable?\r\n\r\nThe probem is that read_sql uses pd.DataFrame.from_records and it reads datetimes with different offsets as \"object\" instead of datetime64[ns,...] (e.g. datetime64[ns, psycopg2.tz.FixedOffsetTimezone(offset=60, name=None)]).\r\n\r\nIf we wanted to modify this behavior we would have to modify the C extension _libs.lib. I don't know how to help with that and I am not sure we want to do this. Even if we could pack the datetimes with differents offsets into a Series with a datetime64 dtype the methods of the .dt accessor are not compatible anyways: currently a ValueError is thrown if one attempts to use the accessor in this case (see traceback in the example in \"Before PR\" below).\r\n\r\n\r\n\r\n# Before PR\r\n\r\n\r\n```python\r\nimport datetime\r\nimport psycopg2\r\nimport sqlalchemy\r\nimport pandas as pd\r\nfrom pandas.io.sql import read_sql, to_sql\r\n\r\n# CREATE ENGINE\r\n# engine = sqlalchemy.create_engine(\"CONNECTION_STRING\")\r\n\r\n# create datetimes with timezone that have different offsets\r\ndata = [[datetime.datetime(2019, 11, 14, 16, 12, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=60, name=None))],\r\n        [datetime.datetime(2019, 8, 7, 15, 37, 4, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=120, name=None))]]\r\n\r\ndf = pd.DataFrame(data, columns = ['ts_tz'])\r\n\r\n# save data\r\nto_sql(frame = df, \r\n       name = 'timezone_diff_offsets_test',\r\n       con = engine,\r\n       schema = 'public',\r\n       if_exists = 'replace',\r\n       index = False)\r\n```\r\n\r\n<details>\r\n <summary>Traceback</summary>\r\n\r\n\r\n```python-traceback\r\n\r\n    ---------------------------------------------------------------------------\r\n\r\n    ValueError                                Traceback (most recent call last)\r\n\r\n    ~/GitHub/pandas/pandas/core/arrays/datetimes.py in objects_to_datetime64ns(data, dayfirst, yearfirst, utc, errors, require_iso8601, allow_object)\r\n       1968         try:\r\n    -> 1969             values, tz_parsed = conversion.datetime_to_datetime64(data)\r\n       1970             # If tzaware, these values represent unix timestamps, so we\r\n\r\n\r\n    ~/GitHub/pandas/pandas/_libs/tslibs/conversion.pyx in pandas._libs.tslibs.conversion.datetime_to_datetime64()\r\n\r\n\r\n    ValueError: Array must be all same time zone\r\n\r\n    \r\n    During handling of the above exception, another exception occurred:\r\n\r\n\r\n    ValueError                                Traceback (most recent call last)\r\n\r\n    <ipython-input-2-a66775d04fe3> in <module>\r\n         20        schema = 'public',\r\n         21        if_exists = 'replace',\r\n    ---> 22        index = False)\r\n    \r\n\r\n    ~/GitHub/pandas/pandas/io/sql.py in to_sql(frame, name, con, schema, if_exists, index, index_label, chunksize, dtype, method)\r\n        519         chunksize=chunksize,\r\n        520         dtype=dtype,\r\n    --> 521         method=method,\r\n        522     )\r\n        523 \r\n\r\n\r\n    ~/GitHub/pandas/pandas/io/sql.py in to_sql(self, frame, name, if_exists, index, index_label, schema, chunksize, dtype, method)\r\n       1318             index_label=index_label,\r\n       1319             schema=schema,\r\n    -> 1320             dtype=dtype,\r\n       1321         )\r\n       1322         table.create()\r\n\r\n\r\n    ~/GitHub/pandas/pandas/io/sql.py in __init__(self, name, pandas_sql_engine, frame, index, if_exists, prefix, index_label, schema, keys, dtype)\r\n        620         if frame is not None:\r\n        621             # We want to initialize based on a dataframe\r\n    --> 622             self.table = self._create_table_setup()\r\n        623         else:\r\n        624             # no data provided, read-only mode\r\n\r\n\r\n    ~/GitHub/pandas/pandas/io/sql.py in _create_table_setup(self)\r\n        869         from sqlalchemy import Table, Column, PrimaryKeyConstraint\r\n        870 \r\n    --> 871         column_names_and_types = self._get_column_names_and_types(self._sqlalchemy_type)\r\n        872 \r\n        873         columns = [\r\n\r\n\r\n    ~/GitHub/pandas/pandas/io/sql.py in _get_column_names_and_types(self, dtype_mapper)\r\n        861         column_names_and_types += [\r\n        862             (str(self.frame.columns[i]), dtype_mapper(self.frame.iloc[:, i]), False)\r\n    --> 863             for i in range(len(self.frame.columns))\r\n        864         ]\r\n        865 \r\n\r\n\r\n    ~/GitHub/pandas/pandas/io/sql.py in <listcomp>(.0)\r\n        861         column_names_and_types += [\r\n        862             (str(self.frame.columns[i]), dtype_mapper(self.frame.iloc[:, i]), False)\r\n    --> 863             for i in range(len(self.frame.columns))\r\n        864         ]\r\n        865 \r\n\r\n\r\n    ~/GitHub/pandas/pandas/io/sql.py in _sqlalchemy_type(self, col)\r\n        971             # timezone information\r\n        972             try:\r\n    --> 973                 if col.dt.tz is not None:\r\n        974                     return TIMESTAMP(timezone=True)\r\n        975             except AttributeError:\r\n\r\n\r\n    ~/GitHub/pandas/pandas/core/accessor.py in _getter(self)\r\n         83         def _create_delegator_property(name):\r\n         84             def _getter(self):\r\n    ---> 85                 return self._delegate_property_get(name)\r\n         86 \r\n         87             def _setter(self, new_values):\r\n\r\n\r\n    ~/GitHub/pandas/pandas/core/indexes/accessors.py in _delegate_property_get(self, name)\r\n         60         from pandas import Series\r\n         61 \r\n    ---> 62         values = self._get_values()\r\n         63 \r\n         64         result = getattr(values, name)\r\n\r\n\r\n    ~/GitHub/pandas/pandas/core/indexes/accessors.py in _get_values(self)\r\n         51                 return PeriodArray(data, copy=False)\r\n         52             if is_datetime_arraylike(data):\r\n    ---> 53                 return DatetimeIndex(data, copy=False, name=self.name)\r\n         54 \r\n         55         raise TypeError(\r\n\r\n\r\n    ~/GitHub/pandas/pandas/core/indexes/datetimes.py in __new__(cls, data, freq, tz, normalize, closed, ambiguous, dayfirst, yearfirst, dtype, copy, name)\r\n        266             dayfirst=dayfirst,\r\n        267             yearfirst=yearfirst,\r\n    --> 268             ambiguous=ambiguous,\r\n        269         )\r\n        270 \r\n\r\n\r\n    ~/GitHub/pandas/pandas/core/arrays/datetimes.py in _from_sequence(cls, data, dtype, copy, tz, freq, dayfirst, yearfirst, ambiguous)\r\n        418             dayfirst=dayfirst,\r\n        419             yearfirst=yearfirst,\r\n    --> 420             ambiguous=ambiguous,\r\n        421         )\r\n        422 \r\n\r\n\r\n    ~/GitHub/pandas/pandas/core/arrays/datetimes.py in sequence_to_dt64ns(data, dtype, copy, tz, dayfirst, yearfirst, ambiguous)\r\n       1864             #  or M8[ns] to denote wall times\r\n       1865             data, inferred_tz = objects_to_datetime64ns(\r\n    -> 1866                 data, dayfirst=dayfirst, yearfirst=yearfirst\r\n       1867             )\r\n       1868             tz = maybe_infer_tz(tz, inferred_tz)\r\n\r\n\r\n    ~/GitHub/pandas/pandas/core/arrays/datetimes.py in objects_to_datetime64ns(data, dayfirst, yearfirst, utc, errors, require_iso8601, allow_object)\r\n       1972             return values.view(\"i8\"), tz_parsed\r\n       1973         except (ValueError, TypeError):\r\n    -> 1974             raise e\r\n       1975 \r\n       1976     if tz_parsed is not None:\r\n\r\n\r\n    ~/GitHub/pandas/pandas/core/arrays/datetimes.py in objects_to_datetime64ns(data, dayfirst, yearfirst, utc, errors, require_iso8601, allow_object)\r\n       1963             dayfirst=dayfirst,\r\n       1964             yearfirst=yearfirst,\r\n    -> 1965             require_iso8601=require_iso8601,\r\n       1966         )\r\n       1967     except ValueError as e:\r\n\r\n\r\n    ~/GitHub/pandas/pandas/_libs/tslib.pyx in pandas._libs.tslib.array_to_datetime()\r\n\r\n\r\n    ~/GitHub/pandas/pandas/_libs/tslib.pyx in pandas._libs.tslib.array_to_datetime()\r\n\r\n\r\n    ValueError: Tz-aware datetime.datetime cannot be converted to datetime64 unless utc=True\r\n\r\n\r\n```\r\n\r\n</details>\r\n\r\n\r\n```python\r\n# save datetimes with UTC timezone in different periods of the year\r\n## create test data\r\ndata = [[datetime.datetime(2019, 11, 14, 15, 12, 0, tzinfo = datetime.timezone.utc)],\r\n        [datetime.datetime(2019, 8, 7, 13, 37, 4,  tzinfo = datetime.timezone.utc)]]\r\n\r\ndf = pd.DataFrame(data, columns = ['ts_tz'])\r\n\r\n## save test data\r\nto_sql(frame = df, \r\n       name = 'timezone_diff_offsets_test',\r\n       con = engine,\r\n       schema = 'public',\r\n       if_exists = 'replace',\r\n       index = False)\r\n\r\n# upon reading if you have for instance \"Europe/Paris\"\r\n# configured as timezone on your local machine then you get datetimes with timezone\r\n# that have different offsets (because they are in different periods of the year)\r\n# due to this you have \"object\" dtype and not datetime64[...]\r\ndf = read_sql('SELECT * FROM timezone_diff_offsets_test', engine)\r\nprint(df,'\\n')\r\nprint(df.dtypes)\r\n```\r\n\r\n                           ts_tz\r\n    0  2019-11-14 16:12:00+01:00\r\n    1  2019-08-07 15:37:04+02:00 \r\n    \r\n    ts_tz    object\r\n    dtype: object\r\n\r\n\r\n# After PR\r\n\r\n\r\n```python\r\nimport datetime\r\nimport psycopg2\r\nimport sqlalchemy\r\nimport pandas as pd\r\nfrom pandas.io.sql import read_sql, to_sql\r\n\r\n# CREATE ENGINE\r\n# engine = sqlalchemy.create_engine(\"CONNECTION_STRING\")\r\n\r\n# create datetimes with timezone that have different offsets\r\ndata = [[datetime.datetime(2019, 11, 14, 16, 12, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=60, name=None))],\r\n        [datetime.datetime(2019, 8, 7, 15, 37, 4, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=120, name=None))]]\r\n\r\ndf = pd.DataFrame(data, columns = ['ts_tz'])\r\n\r\n# save data - no exceptions occur\r\nto_sql(frame = df, \r\n       name = 'timezone_diff_offsets_test',\r\n       con = engine,\r\n       schema = 'public',\r\n       if_exists = 'replace',\r\n       index = False)\r\n\r\n# read data - offsets are dropped and dtype of column ts_tz is datetime64[ns, UTC]\r\ndf = read_sql('SELECT * FROM timezone_diff_offsets_test', engine)\r\nprint(df,'\\n')\r\nprint(df.dtypes)\r\n```\r\n\r\n                          ts_tz\r\n    0 2019-11-14 15:12:00+00:00\r\n    1 2019-08-07 13:37:04+00:00 \r\n    \r\n    ts_tz    datetime64[ns, UTC]\r\n    dtype: object\r\n\r\n","created_at":"2019-12-26T20:00:00Z","updated_at":"2019-12-27T17:24:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6b5d55cc655f5ff760da5b56a65bf9116ffe8e8f","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":47232590,"node_id":"MDU6TGFiZWw0NzIzMjU5MA==","url":"https://api.github.com/repos/pandas-dev/pandas/labels/IO%20SQL","name":"IO SQL","color":"5319e7","default":false,"description":null},{"id":60458168,"node_id":"MDU6TGFiZWw2MDQ1ODE2OA==","url":"https://api.github.com/repos/pandas-dev/pandas/labels/Timezones","name":"Timezones","color":"5319e7","default":false,"description":null}],"milestone":null,"commits_url":"https://api.github.com/repos/pandas-dev/pandas/pulls/30492/commits","review_comments_url":"https://api.github.com/repos/pandas-dev/pandas/pulls/30492/comments","review_comment_url":"https://api.github.com/repos/pandas-dev/pandas/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pandas-dev/pandas/issues/30492/comments","statuses_url":"https://api.github.com/repos/pandas-dev/pandas/statuses/baf1fdf33e7bf74ced3ddadf36a169c7c2cf2043","head":{"label":"ThibTrip:bugfix_sql_different_offsets","ref":"bugfix_sql_different_offsets","sha":"baf1fdf33e7bf74ced3ddadf36a169c7c2cf2043","user":{"login":"ThibTrip","id":40694343,"node_id":"MDQ6VXNlcjQwNjk0MzQz","avatar_url":"https://avatars2.githubusercontent.com/u/40694343?v=4","gravatar_id":"","url":"https://api.github.com/users/ThibTrip","html_url":"https://github.com/ThibTrip","followers_url":"https://api.github.com/users/ThibTrip/followers","following_url":"https://api.github.com/users/ThibTrip/following{/other_user}","gists_url":"https://api.github.com/users/ThibTrip/gists{/gist_id}","starred_url":"https://api.github.com/users/ThibTrip/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ThibTrip/subscriptions","organizations_url":"https://api.github.com/users/ThibTrip/orgs","repos_url":"https://api.github.com/users/ThibTrip/repos","events_url":"https://api.github.com/users/ThibTrip/events{/privacy}","received_events_url":"https://api.github.com/users/ThibTrip/received_events","type":"User","site_admin":false},"repo":{"id":230246213,"node_id":"MDEwOlJlcG9zaXRvcnkyMzAyNDYyMTM=","name":"pandas","full_name":"ThibTrip/pandas","private":false,"owner":{"login":"ThibTrip","id":40694343,"node_id":"MDQ6VXNlcjQwNjk0MzQz","avatar_url":"https://avatars2.githubusercontent.com/u/40694343?v=4","gravatar_id":"","url":"https://api.github.com/users/ThibTrip","html_url":"https://github.com/ThibTrip","followers_url":"https://api.github.com/users/ThibTrip/followers","following_url":"https://api.github.com/users/ThibTrip/following{/other_user}","gists_url":"https://api.github.com/users/ThibTrip/gists{/gist_id}","starred_url":"https://api.github.com/users/ThibTrip/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ThibTrip/subscriptions","organizations_url":"https://api.github.com/users/ThibTrip/orgs","repos_url":"https://api.github.com/users/ThibTrip/repos","events_url":"https://api.github.com/users/ThibTrip/events{/privacy}","received_events_url":"https://api.github.com/users/ThibTrip/received_events","type":"User","site_admin":false},"html_url":"https://github.com/ThibTrip/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/ThibTrip/pandas","forks_url":"https://api.github.com/repos/ThibTrip/pandas/forks","keys_url":"https://api.github.com/repos/ThibTrip/pandas/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ThibTrip/pandas/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ThibTrip/pandas/teams","hooks_url":"https://api.github.com/repos/ThibTrip/pandas/hooks","issue_events_url":"https://api.github.com/repos/ThibTrip/pandas/issues/events{/number}","events_url":"https://api.github.com/repos/ThibTrip/pandas/events","assignees_url":"https://api.github.com/repos/ThibTrip/pandas/assignees{/user}","branches_url":"https://api.github.com/repos/ThibTrip/pandas/branches{/branch}","tags_url":"https://api.github.com/repos/ThibTrip/pandas/tags","blobs_url":"https://api.github.com/repos/ThibTrip/pandas/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ThibTrip/pandas/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ThibTrip/pandas/git/refs{/sha}","trees_url":"https://api.github.com/repos/ThibTrip/pandas/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ThibTrip/pandas/statuses/{sha}","languages_url":"https://api.github.com/repos/ThibTrip/pandas/languages","stargazers_url":"https://api.github.com/repos/ThibTrip/pandas/stargazers","contributors_url":"https://api.github.com/repos/ThibTrip/pandas/contributors","subscribers_url":"https://api.github.com/repos/ThibTrip/pandas/subscribers","subscription_url":"https://api.github.com/repos/ThibTrip/pandas/subscription","commits_url":"https://api.github.com/repos/ThibTrip/pandas/commits{/sha}","git_commits_url":"https://api.github.com/repos/ThibTrip/pandas/git/commits{/sha}","comments_url":"https://api.github.com/repos/ThibTrip/pandas/comments{/number}","issue_comment_url":"https://api.github.com/repos/ThibTrip/pandas/issues/comments{/number}","contents_url":"https://api.github.com/repos/ThibTrip/pandas/contents/{+path}","compare_url":"https://api.github.com/repos/ThibTrip/pandas/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ThibTrip/pandas/merges","archive_url":"https://api.github.com/repos/ThibTrip/pandas/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ThibTrip/pandas/downloads","issues_url":"https://api.github.com/repos/ThibTrip/pandas/issues{/number}","pulls_url":"https://api.github.com/repos/ThibTrip/pandas/pulls{/number}","milestones_url":"https://api.github.com/repos/ThibTrip/pandas/milestones{/number}","notifications_url":"https://api.github.com/repos/ThibTrip/pandas/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ThibTrip/pandas/labels{/name}","releases_url":"https://api.github.com/repos/ThibTrip/pandas/releases{/id}","deployments_url":"https://api.github.com/repos/ThibTrip/pandas/deployments","created_at":"2019-12-26T10:39:16Z","updated_at":"2019-12-26T10:39:19Z","pushed_at":"2019-12-27T15:43:55Z","git_url":"git://github.com/ThibTrip/pandas.git","ssh_url":"git@github.com:ThibTrip/pandas.git","clone_url":"https://github.com/ThibTrip/pandas.git","svn_url":"https://github.com/ThibTrip/pandas","homepage":"https://pandas.pydata.org","size":175415,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause","node_id":"MDc6TGljZW5zZTU="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"pandas-dev:master","ref":"master","sha":"ad2790c0043772baf7386c0ae151c0c91f5934fa","user":{"login":"pandas-dev","id":21206976,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIxMjA2OTc2","avatar_url":"https://avatars2.githubusercontent.com/u/21206976?v=4","gravatar_id":"","url":"https://api.github.com/users/pandas-dev","html_url":"https://github.com/pandas-dev","followers_url":"https://api.github.com/users/pandas-dev/followers","following_url":"https://api.github.com/users/pandas-dev/following{/other_user}","gists_url":"https://api.github.com/users/pandas-dev/gists{/gist_id}","starred_url":"https://api.github.com/users/pandas-dev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pandas-dev/subscriptions","organizations_url":"https://api.github.com/users/pandas-dev/orgs","repos_url":"https://api.github.com/users/pandas-dev/repos","events_url":"https://api.github.com/users/pandas-dev/events{/privacy}","received_events_url":"https://api.github.com/users/pandas-dev/received_events","type":"Organization","site_admin":false},"repo":{"id":858127,"node_id":"MDEwOlJlcG9zaXRvcnk4NTgxMjc=","name":"pandas","full_name":"pandas-dev/pandas","private":false,"owner":{"login":"pandas-dev","id":21206976,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIxMjA2OTc2","avatar_url":"https://avatars2.githubusercontent.com/u/21206976?v=4","gravatar_id":"","url":"https://api.github.com/users/pandas-dev","html_url":"https://github.com/pandas-dev","followers_url":"https://api.github.com/users/pandas-dev/followers","following_url":"https://api.github.com/users/pandas-dev/following{/other_user}","gists_url":"https://api.github.com/users/pandas-dev/gists{/gist_id}","starred_url":"https://api.github.com/users/pandas-dev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pandas-dev/subscriptions","organizations_url":"https://api.github.com/users/pandas-dev/orgs","repos_url":"https://api.github.com/users/pandas-dev/repos","events_url":"https://api.github.com/users/pandas-dev/events{/privacy}","received_events_url":"https://api.github.com/users/pandas-dev/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/pandas-dev/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/pandas-dev/pandas","forks_url":"https://api.github.com/repos/pandas-dev/pandas/forks","keys_url":"https://api.github.com/repos/pandas-dev/pandas/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pandas-dev/pandas/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pandas-dev/pandas/teams","hooks_url":"https://api.github.com/repos/pandas-dev/pandas/hooks","issue_events_url":"https://api.github.com/repos/pandas-dev/pandas/issues/events{/number}","events_url":"https://api.github.com/repos/pandas-dev/pandas/events","assignees_url":"https://api.github.com/repos/pandas-dev/pandas/assignees{/user}","branches_url":"https://api.github.com/repos/pandas-dev/pandas/branches{/branch}","tags_url":"https://api.github.com/repos/pandas-dev/pandas/tags","blobs_url":"https://api.github.com/repos/pandas-dev/pandas/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pandas-dev/pandas/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pandas-dev/pandas/git/refs{/sha}","trees_url":"https://api.github.com/repos/pandas-dev/pandas/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pandas-dev/pandas/statuses/{sha}","languages_url":"https://api.github.com/repos/pandas-dev/pandas/languages","stargazers_url":"https://api.github.com/repos/pandas-dev/pandas/stargazers","contributors_url":"https://api.github.com/repos/pandas-dev/pandas/contributors","subscribers_url":"https://api.github.com/repos/pandas-dev/pandas/subscribers","subscription_url":"https://api.github.com/repos/pandas-dev/pandas/subscription","commits_url":"https://api.github.com/repos/pandas-dev/pandas/commits{/sha}","git_commits_url":"https://api.github.com/repos/pandas-dev/pandas/git/commits{/sha}","comments_url":"https://api.github.com/repos/pandas-dev/pandas/comments{/number}","issue_comment_url":"https://api.github.com/repos/pandas-dev/pandas/issues/comments{/number}","contents_url":"https://api.github.com/repos/pandas-dev/pandas/contents/{+path}","compare_url":"https://api.github.com/repos/pandas-dev/pandas/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pandas-dev/pandas/merges","archive_url":"https://api.github.com/repos/pandas-dev/pandas/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pandas-dev/pandas/downloads","issues_url":"https://api.github.com/repos/pandas-dev/pandas/issues{/number}","pulls_url":"https://api.github.com/repos/pandas-dev/pandas/pulls{/number}","milestones_url":"https://api.github.com/repos/pandas-dev/pandas/milestones{/number}","notifications_url":"https://api.github.com/repos/pandas-dev/pandas/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pandas-dev/pandas/labels{/name}","releases_url":"https://api.github.com/repos/pandas-dev/pandas/releases{/id}","deployments_url":"https://api.github.com/repos/pandas-dev/pandas/deployments","created_at":"2010-08-24T01:37:33Z","updated_at":"2019-12-27T17:02:55Z","pushed_at":"2019-12-27T17:15:52Z","git_url":"git://github.com/pandas-dev/pandas.git","ssh_url":"git@github.com:pandas-dev/pandas.git","clone_url":"https://github.com/pandas-dev/pandas.git","svn_url":"https://github.com/pandas-dev/pandas","homepage":"https://pandas.pydata.org","size":176099,"stargazers_count":22830,"watchers_count":22830,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":9102,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":3290,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause","node_id":"MDc6TGljZW5zZTU="},"forks":9102,"open_issues":3290,"watchers":22830,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/pandas-dev/pandas/pulls/30492"},"html":{"href":"https://github.com/pandas-dev/pandas/pull/30492"},"issue":{"href":"https://api.github.com/repos/pandas-dev/pandas/issues/30492"},"comments":{"href":"https://api.github.com/repos/pandas-dev/pandas/issues/30492/comments"},"review_comments":{"href":"https://api.github.com/repos/pandas-dev/pandas/pulls/30492/comments"},"review_comment":{"href":"https://api.github.com/repos/pandas-dev/pandas/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pandas-dev/pandas/pulls/30492/commits"},"statuses":{"href":"https://api.github.com/repos/pandas-dev/pandas/statuses/baf1fdf33e7bf74ced3ddadf36a169c7c2cf2043"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"jreback"}}