{"id":320771,"name":"HuracanPy","description":"Provide a unified tool for working with cyclone track data.","url":"https://github.com/huracan-project/huracanpy","last_synced_at":"2026-05-27T08:30:20.356Z","repository":{"id":235784453,"uuid":"791215151","full_name":"Huracan-project/huracanpy","owner":"Huracan-project","description":"Package for working with various forms of feature tracking data","archived":false,"fork":false,"pushed_at":"2026-04-16T16:10:21.000Z","size":26136,"stargazers_count":15,"open_issues_count":10,"forks_count":8,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-18T04:13:40.304Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://huracanpy.readthedocs.io/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Huracan-project.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-04-24T09:56:12.000Z","updated_at":"2026-05-06T21:56:43.000Z","dependencies_parsed_at":"2024-05-28T19:44:10.139Z","dependency_job_id":"047bc769-b5ce-436b-83d8-b578bea40da4","html_url":"https://github.com/Huracan-project/huracanpy","commit_stats":null,"previous_names":["huracan-project/huracanpy"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/Huracan-project/huracanpy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Huracan-project%2Fhuracanpy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Huracan-project%2Fhuracanpy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Huracan-project%2Fhuracanpy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Huracan-project%2Fhuracanpy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Huracan-project","download_url":"https://codeload.github.com/Huracan-project/huracanpy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Huracan-project%2Fhuracanpy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33424573,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T22:14:44.296Z","status":"online","status_checked_at":"2026-05-24T02:00:06.296Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"Huracan-project","name":"Huracan-project","uuid":"167978010","kind":"organization","description":null,"email":null,"website":null,"location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/167978010?v=4","repositories_count":1,"last_synced_at":"2024-04-24T15:50:18.579Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/Huracan-project","funding_links":[],"total_stars":0,"followers":0,"following":0,"created_at":"2024-04-24T15:50:18.588Z","updated_at":"2024-04-24T15:50:18.588Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Huracan-project","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Huracan-project/repositories"},"packages":[],"commits":{"id":10581719,"full_name":"huracan-project/huracanpy","default_branch":"main","total_commits":734,"total_committers":3,"total_bot_commits":2,"total_bot_committers":1,"mean_commits":244.66666666666666,"dds":0.4850136239782016,"past_year_total_commits":159,"past_year_total_committers":3,"past_year_total_bot_commits":2,"past_year_total_bot_committers":1,"past_year_mean_commits":53.0,"past_year_dds":0.1132075471698113,"last_synced_at":"2026-05-23T17:11:15.310Z","last_synced_commit":"c152f68745ddeb99183f110b688e553666ff6680","created_at":"2025-07-16T00:21:15.652Z","updated_at":"2026-05-23T17:11:10.817Z","committers":[{"name":"Leo Saffin","email":"string_buster@hotmail.com","login":"leosaffin","count":378},{"name":"stella-bourdin","email":"stella.bourdin@physics.ox.ac.uk","login":"stella-bourdin","count":354},{"name":"copilot-swe-agent[bot]","email":"198982749+Copilot","login":"Copilot","count":2}],"past_year_committers":[{"name":"Leo Saffin","email":"string_buster@hotmail.com","login":"leosaffin","count":141},{"name":"stella-bourdin","email":"stella.bourdin@physics.ox.ac.uk","login":"stella-bourdin","count":16},{"name":"copilot-swe-agent[bot]","email":"198982749+Copilot","login":"Copilot","count":2}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/huracan-project%2Fhuracanpy/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-24T00:00:21.472Z","repositories_count":6240218,"commits_count":884593121,"contributors_count":34911102,"owners_count":1156806,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"huracan-project/huracanpy","html_url":"https://github.com/huracan-project/huracanpy","last_synced_at":"2026-05-24T07:00:54.352Z","status":"active","issues_count":34,"pull_requests_count":200,"avg_time_to_close_issue":4229266.933333334,"avg_time_to_close_pull_request":21669.333333333332,"issues_closed_count":15,"pull_requests_closed_count":177,"pull_request_authors_count":5,"issue_authors_count":10,"avg_comments_per_issue":1.2058823529411764,"avg_comments_per_pull_request":0.15,"merged_pull_requests_count":170,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":18,"past_year_pull_requests_count":63,"past_year_avg_time_to_close_issue":6578540.333333333,"past_year_avg_time_to_close_pull_request":31542.423076923078,"past_year_issues_closed_count":6,"past_year_pull_requests_closed_count":52,"past_year_pull_request_authors_count":4,"past_year_issue_authors_count":9,"past_year_avg_comments_per_issue":1.5,"past_year_avg_comments_per_pull_request":0.36507936507936506,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":47,"created_at":"2025-07-17T00:30:41.825Z","updated_at":"2026-05-24T07:00:54.352Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/huracan-project%2Fhuracanpy","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/huracan-project%2Fhuracanpy/issues","issue_labels_count":{"enhancement":10,"load":4,"documentation":2,"bug":2},"pull_request_labels_count":{"enhancement":2},"issue_author_associations_count":{"NONE":17,"COLLABORATOR":17},"pull_request_author_associations_count":{"COLLABORATOR":190,"NONE":8,"CONTRIBUTOR":2},"issue_authors":{"stella-bourdin":12,"malmans2":7,"leosaffin":5,"nmstreethran":3,"jatkinson1000":2,"burcuboza":1,"ruth56":1,"laj-grant":1,"MRibberink":1,"GiacomoGiuliani":1},"pull_request_authors":{"leosaffin":129,"stella-bourdin":61,"hugoledoux":6,"Copilot":3,"pmansito":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-26T00:00:23.324Z","repositories_count":14705142,"issues_count":33981483,"pull_requests_count":111325339,"authors_count":11274478,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{"enhancement":8,"bug":2,"documentation":2,"load":2},"past_year_pull_request_labels_count":{"enhancement":2},"past_year_issue_author_associations_count":{"COLLABORATOR":10,"NONE":8},"past_year_pull_request_author_associations_count":{"COLLABORATOR":54,"NONE":7,"CONTRIBUTOR":2},"past_year_issue_authors":{"stella-bourdin":6,"leosaffin":4,"jatkinson1000":2,"GiacomoGiuliani":1,"laj-grant":1,"malmans2":1,"MRibberink":1,"nmstreethran":1,"ruth56":1},"past_year_pull_request_authors":{"leosaffin":45,"stella-bourdin":9,"hugoledoux":6,"Copilot":3},"maintainers":[{"login":"leosaffin","count":134,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/leosaffin"},{"login":"stella-bourdin","count":73,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/stella-bourdin"}],"active_maintainers":[{"login":"leosaffin","count":49,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/leosaffin"},{"login":"stella-bourdin","count":15,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/stella-bourdin"}]},"events":{"total":{"ReleaseEvent":6,"DeleteEvent":8,"PullRequestEvent":118,"ForkEvent":1,"IssuesEvent":29,"WatchEvent":8,"IssueCommentEvent":38,"PushEvent":114,"PullRequestReviewEvent":1,"PullRequestReviewCommentEvent":3,"CreateEvent":13},"last_year":{"DeleteEvent":3,"PullRequestEvent":30,"IssuesEvent":14,"WatchEvent":3,"IssueCommentEvent":25,"PushEvent":25,"PullRequestReviewEvent":1,"PullRequestReviewCommentEvent":3,"CreateEvent":2}},"keywords":[],"dependencies":[{"ecosystem":"actions","filepath":".github/workflows/python-package.yaml","sha":null,"kind":"manifest","created_at":"2024-05-03T16:14:34.023Z","updated_at":"2024-05-03T16:14:34.023Z","repository_link":"https://github.com/Huracan-project/huracanpy/blob/main/.github/workflows/python-package.yaml","dependencies":[{"id":17881036881,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":17881036882,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"pypi","filepath":"pyproject.toml","sha":null,"kind":"manifest","created_at":"2024-05-03T16:14:34.300Z","updated_at":"2024-05-03T16:14:34.300Z","repository_link":"https://github.com/Huracan-project/huracanpy/blob/main/pyproject.toml","dependencies":[{"id":17881036883,"package_name":"numpy","ecosystem":"pypi","requirements":"\u003c2","direct":true,"kind":"runtime","optional":false},{"id":17881036884,"package_name":"xarray","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":17881036885,"package_name":"cftime","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":17881036886,"package_name":"parse","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"setup.py","sha":null,"kind":"manifest","created_at":"2024-05-03T16:14:34.320Z","updated_at":"2024-05-03T16:14:34.320Z","repository_link":"https://github.com/Huracan-project/huracanpy/blob/main/setup.py","dependencies":[]}],"score":4.31748811353631,"created_at":"2025-07-16T00:20:55.640Z","updated_at":"2026-05-27T08:30:20.371Z","avatar_url":"https://github.com/Huracan-project.png","language":"Python","category":"Climate Change","sub_category":"Natural Hazard and Storms","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# [![HuracanPy logo, a yellow and blue python spiralling as a cyclone.](docs/images/logo/logo-with-name/Slide1.png)](https://huracanpy.readthedocs.io/en/latest/)\n\n[![Documentation Status](https://readthedocs.org/projects/huracanpy/badge/?version=latest)](https://huracanpy.readthedocs.io/en/latest/?badge=latest)\n[![status](https://joss.theoj.org/papers/bb15b667a6306bcd0383d06d3b788cb6/status.svg)](https://joss.theoj.org/papers/bb15b667a6306bcd0383d06d3b788cb6)\n[![Anaconda-Server Badge](https://anaconda.org/conda-forge/huracanpy/badges/version.svg)](https://anaconda.org/conda-forge/huracanpy)\n\n*A python package for working with various forms of feature tracking data, including but not restricted to cyclone tracks.*\n\n**Why HuracanPy?**\nThe idea of this package is to provide a unified tool for working with cyclone track data. \nIn particular, HuracanPy can read tracks from many different sources/trackers. \nIt also provides useful functions to analyse these tracks, including many common diagnostics.\nOur goal is to make track data analysis more accessible, and to promote good reproducibility practices.\n\n\n# Getting started\nYou can follow [user guide](https://huracanpy.readthedocs.io/en/latest/user_guide/index.html), try out some of the [examples](https://huracanpy.readthedocs.io/en/latest/examples/index.html), or follow the steps below (taken from the user guide).\n\n## Install\nYou can install huracanpy with conda\n```bash\nconda install -c conda-forge huracanpy\n```\nor pip\n```bash\npython -m pip install huracanpy\n```\n\nTo install the most up-to-date version of huracanpy, you can install directly from the repository with\n```bash\npython -m pip install \"huracanpy@git+https://github.com/Huracan-project/huracanpy\"\n```\n\n## Basic usage\nThe first step is to load in some tracks. HuracanPy can load track data from various sources as an [xarray.Dataset](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.html) with a minimal number of assumed variables (track_id, lon, lat, time) e.g.\n```python\nimport huracanpy\n\ntracks = huracanpy.load(huracanpy.example_csv_file)\nprint(tracks)\n```\n\n```\n\u003cxarray.Dataset\u003e Size: 7kB\nDimensions:   (record: 99)\nDimensions without coordinates: record\nData variables:\n    track_id  (record) int64 792B 0 0 0 0 0 0 0 0 0 0 0 ... 2 2 2 2 2 2 2 2 2 2\n    i         (record) int64 792B 482 476 476 477 478 ... 229 230 234 241 249\n    j         (record) int64 792B 417 419 420 420 422 ... 501 509 517 528 542\n    lon       (record) float64 792B 120.5 119.0 119.0 119.2 ... 58.5 60.25 62.25\n    lat       (record) float64 792B -14.25 -14.75 -15.0 ... -39.25 -42.0 -45.5\n    slp       (record) float64 792B 9.988e+04 9.981e+04 ... 9.747e+04 9.754e+04\n    zs        (record) float64 792B -10.71 -16.11 -40.21 ... -218.5 -211.5\n    wind10    (record) float64 792B 14.65 13.99 13.7 17.98 ... 23.69 23.96 23.4\n    time      (record) datetime64[ns] 792B 1980-01-06T06:00:00 ... 1980-01-30...\n```\nEach \"record\" corresponds to a TC point (time, lon, lat).\n\nNote that the data is one dimensional but represents multiple tracks.\nThis is done rather than having track_id as an additional dimension to avoid having to add blank data to each track when they are not the same length.\nThe `groupby` function, built in to xarray, allows us to easily loop over tracks in this format.\n```python\n# Iterating over all tracks\n# Each track will be a subset of the xarray Dataset with a unique track_id\n# The track_id is not necessarily an integer, it follows whatever you have loaded\n# e.g. could be a string for IBTrACS\nfor track_id, track in tracks.groupby(\"track_id\"):\n    # Do something with the track\n    print(track_id, len(track.time))\n```\n```\n0 31\n1 20\n2 48\n```\n\nWith the data loaded, we can apply the functions from HuracanPy. The example below is\nusing the `hrcn` accessor from HuracanPy. See the [accessor](accessor.ipynb) page for\nmore details.\n\n```python\n# Quickly view the tracks\ntracks.hrcn.plot_tracks(intensity_var_name=\"wind10\")\n\n# Add a new variable to the tracks and plot this instead\ntracks = tracks.hrcn.add_is_land()\ntracks.hrcn.plot_tracks(intensity_var_name=\"is_land\")\n```\n![Plot showing 3 tracks in the southern hemisphere with points coloured by wind speed](docs/images/readme/plot_tracks_wind.png)\n![Plot showing 3 tracks in the southern hemisphere with points coloured by whether they are over land or ocean](docs/images/readme/plot_tracks_is_land.png)\n\n# Contact\nPlease use GitHub's functions to communicate with HuracanPy's developers.\n- Use [Issues](https://github.com/Huracan-project/huracanpy/issues) for feature requests or bug reporting\n- Use the [Discussions](https://github.com/Huracan-project/huracanpy/discussions) for Q\u0026A and general feedback \n- Do not forget HuracanPy is an open-source project, and you can also [contribute](https://huracanpy.readthedocs.io/en/latest/dev_guide/index.html) to it. \n\n## Subscribe for updates\n1. Most specific: Subscribe to [this discussion](https://github.com/Huracan-project/huracanpy/discussions/57) for further updates.\n2. Less specific: \"Watch\" the repo by clicking the button on the top-right of this page. Select \"custom\" then tick \"discussions\". You can always go back if there turns out to be too much emails. \n(We wish there was a better way for you to subscribe to announcements. If you agree with us, please up [this issue](https://github.com/orgs/community/discussions/3951).)\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/320771","html_url":"https://ost.ecosyste.ms/projects/320771"}