Skip to main content

Neat formatting for numbers, dates, and strings using numpy.

Reason this release was yanked:

Incorrect developer email

Project description

pyneatR

Neat formatting for numbers, dates, timestamps, and strings using numpy. Implementation inspired by the R package neatR.

Installation

pip install pyneatR

Neat Data for Presentation

Formatting dates

Often, we encounter dates in various formats and want an unambiguous representation. ndate formats dates into a readable mmm dd, yyyy format with the day of the week.

from pyneatR import ndate, nday
from datetime import date, timedelta

today = date.today()
# Assuming today is Nov 09, 2025 (Sun) for these examples

print(ndate(today - timedelta(days=3)))
# "Nov 06, 2025 (Thu)"

print(ndate(today))
# "Nov 09, 2025 (Sun)"

print(ndate(today + timedelta(days=4)))
# "Nov 13, 2025 (Thu)"

To just get the date without the day of week, set display_weekday=False:

print(ndate(today, display_weekday=False))
# "Nov 09, 2025"

For monthly data, abbreviating the date to mmm'yy is elegant:

print(ndate(today, display_weekday=False, is_month=True))
# "Nov'25"

To see the context of the date with respect to current date (within 1 week), use nday.

print(nday(today, reference_alias=False))
# "Sun"

print(nday(today, reference_alias=True))
# "Today, Sun"

Formatting timestamp

Timestamps are feature-rich representations of date and time.

from pyneatR import ntimestamp
from datetime import datetime

now = datetime.now()
# Assuming now is Nov 09, 2025 12:07:48 PM

print(ntimestamp(now))
# "Nov 09, 2025 12H 07M 48S PM (Sun)"

To extract and format only the time:

print(ntimestamp(now, display_weekday=False, include_date=False, include_timezone=False))
# "12H 07M 48S PM"

Components of time can be toggled on or off:

print(ntimestamp(now, include_date=False, display_weekday=False, 
                 include_hours=True, include_minutes=True, include_seconds=False, 
                 include_timezone=False))
# "12H 07M PM"

Formatting number

nnumber formats numeric data in a readable way, automatically handling large numbers.

from pyneatR import nnumber
import numpy as np

x = np.array([10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000])

print(nnumber(x))
# ['10.0' '100.0' '1.0 K' '10.0 K' '100.0 K' '1.0 Mn' '10.0 Mn' '100.0 Mn' '1.0 Bn']

print(nnumber(x, digits=0))
# ['10' '100' '1 K' '10 K' '100 K' '1 Mn' '10 Mn' '100 Mn' '1 Bn']

nnumber can automatically determine the best single unit for all numbers using unit='auto':

x = np.array([1e6, 99e3, 76e3, 42e3, 12e3, 789, 53])
print(nnumber(x, unit='auto'))
# ['1,000 K' '99 K' '76 K' '42 K' '12 K' '0.8 K' '0.1 K']

You can specify the unit directly:

print(nnumber(123456789.123456, unit='Mn'))
# "123.5 Mn"

Default units are 'K', 'Mn', 'Bn', 'Tn'. Custom labels can be provided:

print(nnumber(123456789.123456, unit='M', unit_labels={'million': 'M'}))
# "123.5 M"

Prefixes and suffixes can be added:

print(nnumber(123456789.123456, unit='Mn', prefix='$ '))
# "$ 123.5 Mn"

To show the raw number with separators:

print(nnumber(123456789.123456, digits=2, unit='', thousand_separator=','))
# "123,456,789.12"

Formatting percentages

npercent formats percentages, handling both decimals (0.228) and values already multiplied by 100 (22.8).

from pyneatR import npercent

print(npercent(22.8, is_decimal=False))
# "+22.8%"

print(npercent(0.228, is_decimal=True))
# "+22.8%"

By default is_decimal=True. The plus sign can be toggled:

print(npercent(0.228, plus_sign=False))
# "22.8%"

For growth factors:

tesla_2017 = 20
tesla_2023 = 200
g = (tesla_2023 - tesla_2017) / tesla_2017

print(npercent(g, plus_sign=True))
# "+900.0%"

# factor_out=True is not yet implemented in this version, but check documentation for updates.

Formatting string

nstring formats character vectors, removing special characters or changing case.

from pyneatR import nstring

s = ' All MOdels are wrong. some ARE useful!!! '
print(nstring(s, case='title', remove_specials=True))
# "All Models Are Wrong Some Are Useful"

To retain only English alphabets and numbers:

print(nstring(s, case='title', remove_specials=True, en_only=True))
# "All Models Are Wrong Some Are Useful"

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyneatr-0.1.0.tar.gz (11.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyneatr-0.1.0-py3-none-any.whl (9.4 kB view details)

Uploaded Python 3

File details

Details for the file pyneatr-0.1.0.tar.gz.

File metadata

  • Download URL: pyneatr-0.1.0.tar.gz
  • Upload date:
  • Size: 11.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for pyneatr-0.1.0.tar.gz
Algorithm Hash digest
SHA256 ab044027ad0252d092ea94dd025bd374d88ab7a32b32c08fb62b1877ddd1bff1
MD5 4cce1f0c43a92d1adef09d5dbc75c82e
BLAKE2b-256 8b920acb535de06185bc1b138bd2a7b655efa7fa1b36b260063e19c05dc1d103

See more details on using hashes here.

File details

Details for the file pyneatr-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: pyneatr-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 9.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for pyneatr-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2726633e5c2bfc51a794d60a1e1ee3f68936f358d08cbabd7d442f5c5aabec33
MD5 12a9772c091e907cdce6f28d4570f41d
BLAKE2b-256 13180bf729e47273cc82f8e21dc7a78074305fcc706c686078e7f9e86ba494fe

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page