{ "info": { "author": "Th\u00e9o Friberg", "author_email": "theo.friberg@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "TimeDiffText and TimeDiffPlot\n=============================\n\nThis repository contains two programs, TimeDiffText and TimeDiffPlot. Both take log-files in the form of streams as input. TimeDiffText then outputs the difference in time between log entries, TimeDiffPlot uses Matplotlib, Numpy and Scipy to graph the differences in the log-files. TimeDiffPlot also allows for saving generated graphs into a file. Supported file-formats are _.emf_, _.eps_, _.pdf_, _.png_, _.ps_, _.raw_, _.rgba_, _.svg_ and _.svgz_. Both TimeDiffText and TimeDiffPlot allow any syntax for the time through python [datetime.strftime() and datetime.strptime()](https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior \"Syntax for entering time formats\"). Formatting presets for bothes time-diff and time-diff-plot can be set in /etc/timediff/timediff.json.\n\nTimeDiffPlot requires Matplotlib, Numpy and Scipy.\n\nTimeDiffText and TimeDiffPlot are both written in python 2.7 and compatile with Mac OSX and Linux.\n\nTimeDiff 1.17\n\nKnown issues:\n- Formatting java1 does not read in milliseconds, due to restrictions in Python's datetime module.\n\nInstalling TimeDiff\n===================\n\nTimeDiff can be installed through pip by calling\n\n # pip install timediff\n\nTimeDiffPlot is also dependent of MatPlotLib, NumPy and SciPy. These can be installed by calling\n\n # pip install matplotlib\n\nto install MatPlotLib,\n\n # pip install numpy\n\nto install NumPy and\n\n # pip install scipy\n\nto install SciPy.\n\nDuring its installation, TimeDiff will write a configuration file to _/etc/timediff/timediff.json_. This is why it requires root to install. If _/etc/timediff/timediff.json_ is not found, TimeDiff will quit.\n\nExample of running TimeDiffText and TimeDiffPlot\n================================================\n\nHere is an example of running TimeDiffText and TimeDiffPlot.\n\nWe begin by taking the 10 last lines of _/var/log/syslog_\n\n $ tail /var/log/sysolg > logfile\n\nThe file _logfile_ looks like this:\n\n Oct 10 10:30:33 p WindowServer[119]: CGXSetWindowTransform: Operation on a window 0xb6 requiring rights kCGSWindowRightPresenter by caller com.apple.appkit.xpc.openAndSav\n Oct 10 10:30:33 p com.apple.appkit.xpc.openAndSavePanelService[911]: CGSSetWindowTransformAtPlacement: Failed\n Oct 10 10:30:33 p com.apple.appkit.xpc.openAndSavePanelService[911]: ERROR: CGSSetWindowTransformAtPlacement() returned 1001\n Oct 10 10:30:33 p WindowServer[119]: CGXSetWindowListAlpha: Operation on a window 0xb6 requiring rights kCGSWindowRightPresenter by caller com.apple.appkit.xpc.openAndSav\n Oct 10 10:30:33 p WindowServer[119]: CGXSetWindowTransform: Operation on a window 0xb6 requiring rights kCGSWindowRightPresenter by caller com.apple.appkit.xpc.openAndSav\n Oct 10 10:30:33 p com.apple.appkit.xpc.openAndSavePanelService[911]: CGSSetWindowTransformAtPlacement: Failed\n Oct 10 10:30:33 p com.apple.appkit.xpc.openAndSavePanelService[911]: ERROR: CGSSetWindowTransformAtPlacement() returned 1001\n Oct 10 10:30:33 p WindowServer[119]: CGXSetWindowListAlpha: Operation on a window 0xb6 requiring rights kCGSWindowRightPresenter by caller com.apple.appkit.xpc.openAndSav\n Oct 10 10:30:33 p WindowServer[119]: CGXSetWindowTransform: Operation on a window 0xb6 requiring rights kCGSWindowRightPresenter by caller com.apple.appkit.xpc.openAndSav\n Oct 10 10:30:33 p com.apple.appkit.xpc.openAndSavePanelService[911]: CGSSetWindowTransformAtPlacement: Failed\n\nThen we run TimeDiffText on _logfile_\n\n $ timedifftext logfile -F linux1\n\nAnd we get this output:\n\n 0 s 0 s : Oct 10 10:30:33 p WindowServer[119]: CGXSetWindowTransform: Operation on a window 0xb6 requiring rights kCGSWindowRightPresenter by caller com.apple.appkit.xpc.openAndSav\n \n 0 s 0 s : Oct 10 10:30:33 p com.apple.appkit.xpc.openAndSavePanelService[911]: CGSSetWindowTransformAtPlacement: Failed\n \n 0 s 0 s : Oct 10 10:30:33 p com.apple.appkit.xpc.openAndSavePanelService[911]: ERROR: CGSSetWindowTransformAtPlacement() returned 1001\n \n 0 s 0 s : Oct 10 10:30:33 p WindowServer[119]: CGXSetWindowListAlpha: Operation on a window 0xb6 requiring rights kCGSWindowRightPresenter by caller com.apple.appkit.xpc.openAndSav\n \n 0 s 0 s : Oct 10 10:30:33 p WindowServer[119]: CGXSetWindowTransform: Operation on a window 0xb6 requiring rights kCGSWindowRightPresenter by caller com.apple.appkit.xpc.openAndSav\n \n 0 s 0 s : Oct 10 10:30:33 p com.apple.appkit.xpc.openAndSavePanelService[911]: CGSSetWindowTransformAtPlacement: Failed\n \n 0 s 0 s : Oct 10 10:30:33 p com.apple.appkit.xpc.openAndSavePanelService[911]: ERROR: CGSSetWindowTransformAtPlacement() returned 1001\n \n 0 s 0 s : Oct 10 10:30:33 p WindowServer[119]: CGXSetWindowListAlpha: Operation on a window 0xb6 requiring rights kCGSWindowRightPresenter by caller com.apple.appkit.xpc.openAndSav\n \n 0 s 0 s : Oct 10 10:30:33 p WindowServer[119]: CGXSetWindowTransform: Operation on a window 0xb6 requiring rights kCGSWindowRightPresenter by caller com.apple.appkit.xpc.openAndSav\n \n 0 s 0 s : Oct 10 10:30:33 p com.apple.appkit.xpc.openAndSavePanelService[911]: CGSSetWindowTransformAtPlacement: Failed\n\nThen we run TimeDiffPlot on the original log (_/var/log/messages_)\n\n $ timediffplot /var/log/messages -F linux1 -O graph\n $ ls -l\n\nAnd we get this result:\n\n -rw-r--r-- 1 usr usr 26K Oct 10 11:03 graph_histogram_absolute_lin.png\n -rw-r--r-- 1 usr usr 24K Oct 10 11:03 graph_histogram_interval_lin.png\n -rw-r--r-- 1 usr usr 50K Oct 10 11:01 graph_KDE_absolute_lin.png\n -rw-r--r-- 1 usr usr 39K Oct 10 11:03 graph_KDE_interval_lin.png\n\n\ngraph_histogram_absolute_lin.png\n--------------------------------\n\n![Histogram over time](examples/graph_histogram_absolute_lin.png)\n\nIn this plot we see the quantity of log entries per second plotted against time. The spike at about 260 s means a lot of log activity.\n\ngraph_histogram_interval_lin.png\n--------------------------------\n\n![Interval histogram](examples/graph_histogram_interval_lin.png)\n\nIn this plot we see the quantity of errors per interval of n seconds, n increasing as the x-coordinate increases. Put in an other way: a spike somewhere means that there have been logs coming in a repetitive way every n seconds. The big spike at the left side tells us that the interval between log-entries has been mostly short (one second).\n\ngraph_KDE_absolute_lin.png\n--------------------------\n\nThis plot is the KDE of the first plot. A smooth version of it in other words. Handy if you had a lot of noise in the original plot.\n\n![Kernel density estimation over time](examples/graph_KDE_absolute_lin.png)\n\ngraph_KDE_interval_lin.png\n--------------------------\n\nThis plot is the KDE of the second plot.\n\n![Interval kernel density estimation](examples/graph_KDE_interval_lin.png)\n\nRunning TimeDiffText\n====================\n\nTimeDiffText can be run by calling\n\n $ cat | timedifftext \n\nYou may also want to pipe in data from grep\n\n $ grep | timedifftext \n\nTimeDiffText can also read a file by given filename.\n\n $ timedifftext \n\nTimeDiffText will then output the following\n\n \n\nUsage of TimeDiffText\n---------------------\n\n usage: timedifftext [-h] [--format [FORMAT]] [--format-preset [{linux1,custom1}]]\n [--locale [LOCALE]] [--verbose] [--cancel-padding]\n [--round-to {s,ms,min,h,d}]\n\n Calculate differences in time of log entries and output them into the console.\n\n optional arguments:\n -h, --help show this help message and exit\n --format [FORMAT], -f [FORMAT]\n Sets datetime format options, defaults to\n \"%Y%m%d_%H%M%S\" overrides given presets.\n --format-preset [{linux1,custom1,java1}], -F [{linux1,custom1,java1}]\n Set datetime formatting preset, defaults to custom1.\n Values are: linux1 -> %b %d %H:%M:%S, custom1 ->\n %Y%m%d_%H%M%S java1 -> %Y-%m-%d %H:%M:%S\n --locale [LOCALE], -l [LOCALE]\n Sets locale to be used with parsing month and weekday\n names, defaults to American English (en_US).\n --verbose, -v Sets program to verbose mode. This will result in\n loger descriptions of errors being written to the\n stderr.\n --cancel-padding, -p Cancels adding zero-padding, eg. without -p 2 would\n become 02.\n --round-to {s,ms,min,h,d}, -r {s,ms,min,h,d}\n Sets what time-unit to round to while doing\n formatting.\n\nRunning TimeDiffPlot\n====================\n\nTimeDiffPlot can be run by calling\n\n $ cat | timediffplot \n\nYou may also want to pipe in data from grep\n\n $ grep | timediffplot \n\nTimeDiffPlot can also read a file by given filename.\n\n $ timediffplot \n\nTimeDiffPlot only outputs errors by default. Instead, TimeDiffPlot will open windows and draw graphs using matplotlib. This behaviour can be changed, resulting in TimeDiffPlot rather writing the graphs to disk. Using TimeDiffPlot with logs of over 50 000 lines may take some time.\n\nUsage of TimeDiffPlot\n---------------------\n\n usage: timediffplot [-h] [--format [FORMAT]]\n [--format-preset [{linux1,custom1}]] [--locale [LOCALE]]\n [--verbose] [--cancel-padding] [--logarithmic]\n\n Calculate differences in time of log entries and output them into the console.\n\n optional arguments:\n -h, --help show this help message and exit\n --format [FORMAT], -f [FORMAT]\n Sets datetime format options, overrides given presets.\n --format-preset [{linux1,custom1,java1}], -F [{linux1,custom1,java1}]\n Set datetime formatting preset, defaults to custom1.\n Values are: linux1 -> %b %d %H:%M:%S, custom1 ->\n %Y%m%d_%H%M%S java1 -> %Y-%m-%d %H:%M:%S\n --locale [LOCALE], -l [LOCALE]\n Sets locale to be used with parsing month and weekday\n names, defaults to American English (en_US).\n --verbose, -v Sets program to verbose mode. This will result in\n loger descriptions of errors being written to the\n stderr.\n --cancel-padding, -p Cancels adding zero-padding, eg. without -p 2 would\n become 02.\n --logarithmic, -L Sets y-axis of plots to be on a logarithmic scale\n\n --output-path, -O Path for outputting images to disk.\n\n --output-format, -o Format of outputted graphs. Choices are .emf, .eps, .pdf, .png, .ps, .raw, .rgba, .svg and .svgz.", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/nomelif/time-diff", "keywords": null, "license": "The MIT License (MIT)\n\nCopyright (c) 2014 Th\u00e9o Friberg\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.", "maintainer": null, "maintainer_email": null, "name": "TimeDiff", "package_url": "https://pypi.org/project/TimeDiff/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/TimeDiff/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/nomelif/time-diff" }, "release_url": "https://pypi.org/project/TimeDiff/1.17/", "requires_dist": null, "requires_python": null, "summary": "Program for login and plotting time-differences in log-files.", "version": "1.17" }, "last_serial": 1254260, "releases": { "0.9.2": [ { "comment_text": "", "digests": { "md5": "79e84febb9458e684ac4eebd05e55284", "sha256": "56987cfcea093b90c4a97cd3e556e0949215c50d19728a9c1b23e12dc5ba6f1d" }, "downloads": -1, "filename": "TimeDiff-0.9.2.tar.gz", "has_sig": false, "md5_digest": "79e84febb9458e684ac4eebd05e55284", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15325, "upload_time": "2014-10-09T06:36:18", "url": "https://files.pythonhosted.org/packages/e6/8a/c20c554fac815c5e545d10e9815767616d0ccd3387217d8d519202cebe5f/TimeDiff-0.9.2.tar.gz" } ], "0.9.3": [ { "comment_text": "", "digests": { "md5": "7aeab6b8433ef51c5b1bfa9ce0addfa0", "sha256": "2dbb56895514e4ef8e07bfdbe018c0ee4789c10fbfcbec244535f5f8cff8afcc" }, "downloads": -1, "filename": "TimeDiff-0.9.3.tar.gz", "has_sig": false, "md5_digest": "7aeab6b8433ef51c5b1bfa9ce0addfa0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15375, "upload_time": "2014-10-09T06:49:05", "url": "https://files.pythonhosted.org/packages/91/0c/774e918f7f914f936e1a1d2d6c83ffbe37ef3e05fee0da9e30c062cb3741/TimeDiff-0.9.3.tar.gz" } ], "0.9.35": [ { "comment_text": "", "digests": { "md5": "86f2095fcdd91ca45e5111432697f027", "sha256": "a214b4da3ca700c34d826b78d4f06cafeea3e9da97fac74e407a4d20952e896c" }, "downloads": -1, "filename": "TimeDiff-0.9.35.tar.gz", "has_sig": false, "md5_digest": "86f2095fcdd91ca45e5111432697f027", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17575, "upload_time": "2014-10-09T08:25:59", "url": "https://files.pythonhosted.org/packages/73/b6/897fd088936c5a78953208d41afba1ca63b24f7fbbf75558b360ebb5f339/TimeDiff-0.9.35.tar.gz" } ], "0.9.36": [ { "comment_text": "", "digests": { "md5": "d9859c657321f8e98c9dfdb02ed5de2b", "sha256": "3f63fa6ed52ff10b6104069809064039052096ba7c49d7a3b6828afc1eb30533" }, "downloads": -1, "filename": "TimeDiff-0.9.36.tar.gz", "has_sig": false, "md5_digest": "d9859c657321f8e98c9dfdb02ed5de2b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17585, "upload_time": "2014-10-09T09:44:49", "url": "https://files.pythonhosted.org/packages/88/78/2fef7a95fd8787ca7ca486163719617c3bc7d1d51a833b57e7496b936bf0/TimeDiff-0.9.36.tar.gz" } ], "0.9.37": [ { "comment_text": "", "digests": { "md5": "992ed0642bb98bef44df8475de23d151", "sha256": "485401b70974f8561b1fd15dfe96a962a69f27d6223b9008e945a8a83ff69b10" }, "downloads": -1, "filename": "TimeDiff-0.9.37.tar.gz", "has_sig": false, "md5_digest": "992ed0642bb98bef44df8475de23d151", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17544, "upload_time": "2014-10-09T09:48:06", "url": "https://files.pythonhosted.org/packages/3a/7e/29ec7c19c0f930f96497de38a88dfb5be3d56a836bced131bd13257853c4/TimeDiff-0.9.37.tar.gz" } ], "0.9.38": [ { "comment_text": "", "digests": { "md5": "33cc1c4d980c8d88af5b1aae3c2d9176", "sha256": "23da0e912793d3b74b877f6bdb0525b53b3d399cf429229c77af4061ca93bd25" }, "downloads": -1, "filename": "TimeDiff-0.9.38.tar.gz", "has_sig": false, "md5_digest": "33cc1c4d980c8d88af5b1aae3c2d9176", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16444, "upload_time": "2014-10-09T11:28:00", "url": "https://files.pythonhosted.org/packages/f9/0d/462b27f3d366a46092b477bf17a08dcca372138ae563a12a926eb397332a/TimeDiff-0.9.38.tar.gz" } ], "0.9.39": [ { "comment_text": "", "digests": { "md5": "fb0a2a85ec30d78981ade0a9f4923f19", "sha256": "773f9753318ceeee5ae381dde04a882d04b04a992f86e1763fd5bbdd75f50d3e" }, "downloads": -1, "filename": "TimeDiff-0.9.39.tar.gz", "has_sig": false, "md5_digest": "fb0a2a85ec30d78981ade0a9f4923f19", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18208, "upload_time": "2014-10-09T11:31:27", "url": "https://files.pythonhosted.org/packages/3a/89/1f4dbcab387dc690a23ad983f158b788c5b7cd3a75f0a6e101420f22fd5b/TimeDiff-0.9.39.tar.gz" } ], "0.9.4": [ { "comment_text": "", "digests": { "md5": "cbe03a80f15eda5bb899200d07fef8f9", "sha256": "a598f14ab8fe878b9b0252c710d31ed1acdba2d7c7f12340151d9e441279506c" }, "downloads": -1, "filename": "TimeDiff-0.9.4.tar.gz", "has_sig": false, "md5_digest": "cbe03a80f15eda5bb899200d07fef8f9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18204, "upload_time": "2014-10-09T11:39:52", "url": "https://files.pythonhosted.org/packages/d5/8f/5041a4385442bbe5202ef9a8454934380f63ae11b7905cf6fc4ee224c346/TimeDiff-0.9.4.tar.gz" } ], "0.9.5": [ { "comment_text": "", "digests": { "md5": "64cabfc2eb2e8c1d852590070c267435", "sha256": "ddb72f36a19c61f9466b82b0f13867bb55c46986edad15b9091d61e33aa060cb" }, "downloads": -1, "filename": "TimeDiff-0.9.5.tar.gz", "has_sig": false, "md5_digest": "64cabfc2eb2e8c1d852590070c267435", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18252, "upload_time": "2014-10-09T11:55:50", "url": "https://files.pythonhosted.org/packages/ca/89/e66d6a317054309949a65636771e049b9b038a013138281b7c447dc98b35/TimeDiff-0.9.5.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "d18f49e30ff4ac8ffb442390ac648f33", "sha256": "902727ba776cd21b4eeeffb6a250fdf126272dd2949fd72bacefcce85ff28424" }, "downloads": -1, "filename": "TimeDiff-1.0.tar.gz", "has_sig": false, "md5_digest": "d18f49e30ff4ac8ffb442390ac648f33", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18259, "upload_time": "2014-10-09T12:23:27", "url": "https://files.pythonhosted.org/packages/af/3f/02a5476f51567ca581441b5f2532666f273b61cf1cdc8ffa1822ee6dd6bd/TimeDiff-1.0.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "62baa9da0e0cea203635e7fcb48b8a5d", "sha256": "b8409f5c48554d52c71941b69f8de53d5aafa290155f633068de6cb58d437b81" }, "downloads": -1, "filename": "TimeDiff-1.1.tar.gz", "has_sig": false, "md5_digest": "62baa9da0e0cea203635e7fcb48b8a5d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18280, "upload_time": "2014-10-10T06:56:35", "url": "https://files.pythonhosted.org/packages/27/1f/cea483d99c3c2f84979bc4399def229cfd9f36124e4c105443b8c8309b6d/TimeDiff-1.1.tar.gz" } ], "1.15": [ { "comment_text": "", "digests": { "md5": "ce4a1136d2699ab8ebd99831d611150c", "sha256": "103daa280e00206c7707b772a59d9075489e824410f207bbeef5d35eec2ce89b" }, "downloads": -1, "filename": "TimeDiff-1.15.tar.gz", "has_sig": false, "md5_digest": "ce4a1136d2699ab8ebd99831d611150c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20459, "upload_time": "2014-10-10T08:37:06", "url": "https://files.pythonhosted.org/packages/fb/bf/8fb1a5fa03a248dd67eed749e81935ba9602429981f9e70c9fefee409645/TimeDiff-1.15.tar.gz" } ], "1.16": [ { "comment_text": "", "digests": { "md5": "986d53d06af9bc9aa6b375bdf8f0c898", "sha256": "3085dcbf4c0aa37b10f5d78d1316b83a2ca2dd6a64183a7140da5bc418df004d" }, "downloads": -1, "filename": "TimeDiff-1.16.tar.gz", "has_sig": false, "md5_digest": "986d53d06af9bc9aa6b375bdf8f0c898", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21211, "upload_time": "2014-10-10T10:04:29", "url": "https://files.pythonhosted.org/packages/0a/5e/6941a47575c56dd482838e224244cd8efc18baee629d96cddf59ee7eee65/TimeDiff-1.16.tar.gz" } ], "1.17": [ { "comment_text": "", "digests": { "md5": "6efb8a51106cb7c699d025389aa235a9", "sha256": "f525968d999ad409c190fcb585d4679331cfc51c4d1aa6cd441d73d2104ab774" }, "downloads": -1, "filename": "TimeDiff-1.17.tar.gz", "has_sig": false, "md5_digest": "6efb8a51106cb7c699d025389aa235a9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28114, "upload_time": "2014-10-10T11:38:00", "url": "https://files.pythonhosted.org/packages/4e/ad/3137e60a839012ffba72da16eca691e14e5ff1a8554fb8e47cc08d25a949/TimeDiff-1.17.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6efb8a51106cb7c699d025389aa235a9", "sha256": "f525968d999ad409c190fcb585d4679331cfc51c4d1aa6cd441d73d2104ab774" }, "downloads": -1, "filename": "TimeDiff-1.17.tar.gz", "has_sig": false, "md5_digest": "6efb8a51106cb7c699d025389aa235a9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28114, "upload_time": "2014-10-10T11:38:00", "url": "https://files.pythonhosted.org/packages/4e/ad/3137e60a839012ffba72da16eca691e14e5ff1a8554fb8e47cc08d25a949/TimeDiff-1.17.tar.gz" } ] }