конвертировать время (без даты) в Matplotlib num с помощью date2num () - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть датафрейм df, подобный этому:

enter image description here

        datetime          duration
0   2018-10-08 13:30:00    03:00
1   2018-10-08 16:40:00    00:11
2   2018-10-08 21:30:00    03:19
3   2018-10-09 03:21:00    04:27
4   2018-10-09 07:49:00    02:11

оба типа двух столбцов являются pandas.core.series.Series as:

In[20]:  type(df_sleep['datetime'])
Out[20]: pandas.core.series.Series

In[21]:  type(df_sleep['duration'])
Out[20]: pandas.core.series.Series

И я хочу использовать следующее для преобразования данных:

import matplotlib.dates as dates
dates.date2num(df_sleep['datetime'])
dates.date2num(df_sleep['duration'])

во время работы столбца datetime в столбце duration отображается следующая ошибка:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-22-3720cbfdbdfa> in <module>()
----> 1 dates.date2num(df_sleep['duration'])

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/dates.py in date2num(d)
    450         if not d.size:
    451             return d
--> 452         return _to_ordinalf_np_vectorized(d)
    453 
    454 

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/numpy/lib/function_base.py in __call__(self, *args, **kwargs)
   2753             vargs.extend([kwargs[_n] for _n in names])
   2754 
-> 2755         return self._vectorize_call(func=func, args=vargs)
   2756 
   2757     def _get_ufunc_and_otypes(self, func, args):

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/numpy/lib/function_base.py in _vectorize_call(self, func, args)
   2823             res = func()
   2824         else:
-> 2825             ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args)
   2826 
   2827             # Convert args to object arrays first

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/numpy/lib/function_base.py in _get_ufunc_and_otypes(self, func, args)
   2783 
   2784             inputs = [arg.flat[0] for arg in args]
-> 2785             outputs = func(*inputs)
   2786 
   2787             # Performance note: profiling indicates that -- for simple

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/dates.py in _to_ordinalf(dt)
    253         tzi = UTC
    254 
--> 255     base = float(dt.toordinal())
    256 
    257     # If it's sufficiently datetime-like, it will have a `date()` method

AttributeError: 'str' object has no attribute 'toordinal'

У кого-нибудь есть идеи? Моя конечная цель состоит в том, чтобы построить данные в «datetime» (ось x) - «duration» (ось y), используя Matplotlib. Я думаю, это потому, что столбец df ['duration'] содержит только время, но не дату, и не может делать конверсию? Как я должен сделать, чтобы сделать заговор?

Большое спасибо за любые предложения!

1 Ответ

0 голосов
/ 05 ноября 2018

Полагаю, ваш формат продолжительности:% H:% M. Прежде всего, измените формат вашего столбца на datetime.

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter, date2num

df['datetime'] = pd.to_datetime(df.datetime)
df["duration"] = pd.to_datetime(df["duration"],format="%H:%M")

fig, ax = plt.subplots()

myFmt = DateFormatter("%H:%M:%S")
ax.yaxis.set_major_formatter(myFmt)

ax.plot(df['datetime'], df['duration'])

plt.gcf().autofmt_xdate()

plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...