utils.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from datetime import datetime
  2. from numbers import Number
  3. from typing import TYPE_CHECKING
  4. import numpy
  5. if TYPE_CHECKING:
  6. from pandas import Timestamp
  7. def floor_datetime(dt: datetime, duration: float) -> datetime:
  8. return datetime.fromtimestamp(dt.timestamp() - dt.timestamp() % duration)
  9. def default_json(x):
  10. if hasattr(x, "tolist"):
  11. return x.tolist()
  12. if hasattr(x, "isoformat"):
  13. return x.isoformat()
  14. return x
  15. def parse_date(text: None, default: 'Timestamp') -> 'Timestamp':
  16. if not text:
  17. return default
  18. from dateutil.parser import parse
  19. return parse(text)
  20. def _format_number(n: Number) -> str:
  21. if n == 0:
  22. return "0"
  23. power = int(numpy.log10(abs(n)))
  24. if power >= 6:
  25. n = n / 1000000
  26. if n >= 10:
  27. n = str(int(n))
  28. else:
  29. n = "%.1f" % n
  30. if n.endswith("0"):
  31. n = n[:-2]
  32. suffix = "M"
  33. elif power >= 3:
  34. n = n / 1000
  35. if n >= 10:
  36. n = str(int(n))
  37. else:
  38. n = "%.1f" % n
  39. if n.endswith("0"):
  40. n = n[:-2]
  41. suffix = "K"
  42. else:
  43. n = str(n)
  44. suffix = ""
  45. return n + suffix
  46. def import_pandas():
  47. import pandas
  48. try:
  49. from pandas.plotting import register_matplotlib_converters
  50. register_matplotlib_converters()
  51. except ImportError:
  52. pass
  53. return pandas