Отформатируйте ось X при построении рядов панд с указанием timedeltas в качестве индексов. - PullRequest
0 голосов
/ 21 февраля 2019

Я бы хотел построить серию панд с timedeltas в качестве индекса и настроить формат x-tick.Минимальный пример будет:

import pandas as pd
import matplotlib.pyplot as plt
times = ['Wed Feb 20 08:28:04 PST 2019', 'Wed Feb 20 09:29:04 PST 2019', 'Wed Feb 20 10:30:04 PST 2019']
timestamps = [pd.Timestamp(t) for t in times]
timedeltas = [t - timestamps[0] for t in timestamps]
timedeltas
ts = pd.Series([1, 2, 5], index=timedeltas)
ts.plot()
plt.savefig("/tmp/plot.png")`

Which produces the following
[output][1].

Я хотел бы отформатировать timedeltas как [часы]: [минуты].

Добавление

import matplotlib.dates as mdates
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))

приводит к следующей ошибке:

ValueError: Cannot convert -1000000000000 to a date.  This often happens if non-datetime values are passed to an axis that expects datetime objects.

1 Ответ

0 голосов
/ 21 февраля 2019

Проблема здесь в том, что мы не можем отформатировать timedeltas.

Есть отличное решение для этого @ Shawn Chin здесь

Я немного отредактировал его ответ, чтобы добавить начальные нули к часам и минутам, где это применимо, исключительно потому, что я думаю, что это выглядит лучше.Хотя это также ограничит количество дней до двух цифр, но из вашего вопроса я предполагаю, что вы хотите отображать только часы и минуты.

Слегка отредактированная функция Шона:

def strfdelta(tdelta, fmt):
    d = {"days": tdelta.days}
    d["hours"], rem = divmod(tdelta.seconds, 3600)
    d["minutes"], d["seconds"] = divmod(rem, 60)
    for key in d:
        d[key] = "{:02d}".format(d[key])
    return fmt.format(**d)

Добавление одного дополнительногострока в вашем коде для вызова этой функции. Надеюсь, вы получите результат, который вам нужен:

import pandas as pd
import matplotlib.pyplot as plt
times = ['Wed Feb 20 08:28:04 PST 2019', 'Wed Feb 20 09:29:04 PST 2019', 'Wed Feb 20 10:30:04 PST 2019']
timestamps = [pd.Timestamp(t) for t in times]
timedeltas = [t - timestamps[0] for t in timestamps]
timedeltas = [strfdelta(t, '{hours}:{minutes}') for t in timedeltas]
ts = pd.Series([1, 2, 5], index=timedeltas)
ts.plot()

Line Chart Output

Надеюсь, это поможет!

...