0.15.0 / TBD


  • Load DataFrame with to_gbq to a table in a project different from the API client project. Specify the target table ID as project.dataset.table to use this feature. (GH#321, GH#347)

0.14.1 / 2020-11-10

Bug fixes

  • Use object dtype for TIME columns. (GH#328)
  • Encode floating point values with greater precision. (GH#326)
  • Support INT64 and other standard SQL aliases in to_gbq() table_schema argument. (GH#322)

0.14.0 / 2020-10-05

  • Add dtypes argument to read_gbq. Use this argument to override the default dtype for a particular column in the query results. For example, this can be used to select nullable integer columns as the Int64 nullable integer pandas extension type. (GH#242, GH#332)
df = gbq.read_gbq(
    "SELECT CAST(NULL AS INT64) AS null_integer",
    dtypes={"null_integer": "Int64"},

Dependency updates

  • Support google-cloud-bigquery-storage 2.0 and higher. (GH#329)
  • Update the minimum version of pandas to 0.20.1. (GH#331)

Internal changes

  • Update tests to run against Python 3.8. (GH#331)

0.13.3 / 2020-09-30

  • Include needed “extras” from google-cloud-bigquery package as dependencies. Exclude incompatible 2.0 version. (GH#324, GH#329)

0.13.2 / 2020-05-14

  • Fix Provided Schema does not match Table error when the existing table contains required fields. (GH#315)

0.13.1 / 2020-02-13

  • Fix AttributeError with BQ Storage API to download empty results. (GH#299)

0.13.0 / 2019-12-12

  • Raise NotImplementedError when the deprecated private_key argument is used. (GH#301)

0.12.0 / 2019-11-25

  • Add max_results argument to read_gbq(). Use this argument to limit the number of rows in the results DataFrame. Set max_results to 0 to ignore query outputs, such as for DML or DDL queries. (GH#102)
  • Add progress_bar_type argument to read_gbq(). Use this argument to display a progress bar when downloading data. (GH#182)

Dependency updates

  • Update the minimum version of google-cloud-bigquery to 1.11.1. (GH#296)


  • Add code samples to introduction and refactor howto guides. (GH#239)

0.11.0 / 2019-07-29

  • Breaking Change: Python 2 support has been dropped. This is to align with the pandas package which dropped Python 2 support at the end of 2019. (GH#268)


  • Ensure table_schema argument is not modified inplace. (GH#278)

Implementation changes

  • Use object dtype for STRING, ARRAY, and STRUCT columns when there are zero rows. (GH#285)

Internal changes

  • Populate user-agent with pandas version information. (GH#281)
  • Fix pytest.raises usage for latest pytest. Fix warnings in tests. (GH#282)
  • Update CI to install nightly packages in the conda tests. (GH#254)

0.10.0 / 2019-04-05

  • Breaking Change: Default SQL dialect is now standard. Use pandas_gbq.context.dialect to override the default value. (GH#195, GH#245)


Dependency updates

  • Update the minimum version of google-cloud-bigquery to 1.9.0. (GH#247)
  • Update the minimum version of pandas to 0.19.0. (GH#262)

Internal changes

  • Update the authentication credentials. Note: You may need to set reauth=True in order to update your credentials to the most recent version. This is required to use new functionality such as the BigQuery Storage API. (GH#267)
  • Use to_dataframe() from google-cloud-bigquery in the read_gbq() function. (GH#247)


  • Fix a bug where pandas-gbq could not upload an empty DataFrame. (GH#237)
  • Allow table_schema in to_gbq() to contain only a subset of columns, with the rest being populated using the DataFrame dtypes (GH#218) (contributed by @johnpaton)
  • Read project_id in to_gbq() from provided credentials if available (contributed by @daureg)
  • read_gbq uses the timezone-aware DatetimeTZDtype(unit='ns', tz='UTC') dtype for BigQuery TIMESTAMP columns. (GH#269)
  • Add use_bqstorage_api to read_gbq(). The BigQuery Storage API can be used to download large query results (>125 MB) more quickly. If the BQ Storage API can’t be used, the BigQuery API is used instead. (GH#133, GH#270)

0.9.0 / 2019-01-11

  • Warn when deprecated private_key parameter is used (GH#240)
  • New dependency Use the pydata-google-auth package for authentication. (GH#241)

0.8.0 / 2018-11-12

Breaking changes


  • Allow newlines in data passed to to_gbq. (GH#180)
  • Add pandas_gbq.context.dialect to allow overriding the default SQL syntax dialect. (GH#195, GH#235)
  • Support Python 3.7. (GH#197, GH#232)

Internal changes

0.7.0 / 2018-10-19

  • int columns which contain NULL are now cast to float, rather than object type. (GH#174)
  • DATE, DATETIME and TIMESTAMP columns are now parsed as pandas’ timestamp objects (GH#224)
  • Add pandas_gbq.Context to cache credentials in-memory, across calls to read_gbq and to_gbq. (GH#198, GH#208)
  • Fast queries now do not log above DEBUG level. (GH#204) With BigQuery’s release of clustering querying smaller samples of data is now faster and cheaper.
  • Don’t load credentials from disk if reauth is True. (GH#212) This fixes a bug where pandas-gbq could not refresh credentials if the cached credentials were invalid, revoked, or expired, even when reauth=True.
  • Catch RefreshError when trying credentials. (GH#226)

Internal changes

  • Avoid listing datasets and tables in system tests. (GH#215)
  • Improved performance from eliminating some duplicative parsing steps (GH#224)

0.6.1 / 2018-09-11

  • Improved read_gbq performance and memory consumption by delegating DataFrame construction to the Pandas library, radically reducing the number of loops that execute in python (GH#128)
  • Reduced verbosity of logging from read_gbq, particularly for short queries. (GH#201)
  • Avoid SELECT 1 query when running to_gbq. (GH#202)

0.6.0 / 2018-08-15

  • Warn when dialect is not passed in to read_gbq. The default dialect will be changing from ‘legacy’ to ‘standard’ in a future version. (GH#195)
  • Use general float with 15 decimal digit precision when writing to local CSV buffer in to_gbq. This prevents numerical overflow in certain edge cases. (GH#192)

0.5.0 / 2018-06-15

  • Project ID parameter is optional in read_gbq and to_gbq when it can inferred from the environment. Note: you must still pass in a project ID when using user-based authentication. (GH#103)
  • Progress bar added for to_gbq, through an optional library tqdm as dependency. (GH#162)
  • Add location parameter to read_gbq and to_gbq so that pandas-gbq can work with datasets in the Tokyo region. (GH#177)


Internal changes

  • Tests now use nox to run in multiple Python environments. (GH#52)
  • Renamed internal modules. (GH#154)
  • Refactored auth to an internal auth module. (GH#176)
  • Add unit tests for get_credentials(). (GH#184)

0.4.1 / 2018-04-05

  • Only show verbose deprecation warning if Pandas version does not populate it. (GH#157)

0.4.0 / 2018-04-03

  • Fix bug in read_gbq when building a dataframe with integer columns on Windows. Explicitly use 64bit integers when converting from BQ types. (GH#119)
  • Fix bug in read_gbq when querying for an array of floats (GH#123)
  • Fix bug in read_gbq with configuration argument. Updates read_gbq to account for breaking change in the way google-cloud-python version 0.32.0+ handles query configuration API representation. (GH#152)
  • Fix bug in to_gbq where seconds were discarded in timestamp columns. (GH#148)
  • Fix bug in to_gbq when supplying a user-defined schema (GH#150)
  • Deprecate the verbose parameter in read_gbq and to_gbq. Messages use the logging module instead of printing progress directly to standard output. (GH#12)

0.3.1 / 2018-02-13

  • Fix an issue where Unicode couldn’t be uploaded in Python 2 (GH#106)
  • Add support for a passed schema in :func:to_gbq instead inferring the schema from the passed DataFrame with DataFrame.dtypes (GH#46)
  • Fix an issue where a dataframe containing both integer and floating point columns could not be uploaded with to_gbq (GH#116)
  • to_gbq now uses to_csv to avoid manually looping over rows in a dataframe (should result in faster table uploads) (GH#96)

0.3.0 / 2018-01-03

  • Use the google-cloud-bigquery library for API calls. The google-cloud-bigquery package is a new dependency, and dependencies on google-api-python-client and httplib2 are removed. See the installation guide for more details. (GH#93)
  • Structs and arrays are now named properly (GH#23) and BigQuery functions like array_agg no longer run into errors during type conversion (GH#22).
  • to_gbq() now uses a load job instead of the streaming API. Remove StreamingInsertError class, as it is no longer used by to_gbq(). (GH#7, GH#75)

0.2.1 / 2017-11-27

  • read_gbq() now raises QueryTimeout if the request exceeds the query.timeoutMs value specified in the BigQuery configuration. (GH#76)
  • Environment variable PANDAS_GBQ_CREDENTIALS_FILE can now be used to override the default location where the BigQuery user account credentials are stored. (GH#86)
  • BigQuery user account credentials are now stored in an application-specific hidden user folder on the operating system. (GH#41)

0.2.0 / 2017-07-24

  • Drop support for Python 3.4 (GH#40)
  • The dataframe passed to `.to_gbq(...., if_exists='append')` needs to contain only a subset of the fields in the BigQuery schema. (GH#24)
  • Use the google-auth library for authentication because oauth2client is deprecated. (GH#39)
  • read_gbq() now has a auth_local_webserver boolean argument for controlling whether to use web server or console flow when getting user credentials. Replaces –noauth_local_webserver command line argument. (GH#35)
  • read_gbq() now displays the BigQuery Job ID and standard price in verbose output. (GH#70 and GH#71)

0.1.6 / 2017-05-03

  • All gbq errors will simply be subclasses of ValueError and no longer inherit from the deprecated PandasError.

0.1.4 / 2017-03-17

  • InvalidIndexColumn will be raised instead of InvalidColumnOrder in read_gbq() when the index column specified does not exist in the BigQuery schema. (GH#6)

0.1.3 / 2017-03-04

  • Bug with appending to a BigQuery table where fields have modes (NULLABLE,REQUIRED,REPEATED) specified. These modes were compared versus the remote schema and writing a table via to_gbq() would previously raise. (GH#13)

0.1.2 / 2017-02-23

Initial release of transfered code from pandas

Includes patches since the 0.19.2 release on pandas with the following:

  • read_gbq() now allows query configuration preferences pandas-GH#14742
  • read_gbq() now stores INTEGER columns as dtype=object if they contain NULL values. Otherwise they are stored as int64. This prevents precision lost for integers greather than 2**53. Furthermore FLOAT columns with values above 10**4 are no longer casted to int64 which also caused precision loss pandas-GH#14064, and pandas-GH#14305