python - tablas - Fecha de visualización del gráfico de línea del marco de datos de Pandas en xaxis
time pandas python (1)
Compare el siguiente código:
test = pd.DataFrame({''date'':[''20170527'',''20170526'',''20170525''],''ratio1'':[1,0.98,0.97]})
test[''date''] = pd.to_datetime(test[''date''])
test = test.set_index(''date'')
ax = test.plot()
DateFormatter
al final:
test = pd.DataFrame({''date'':[''20170527'',''20170526'',''20170525''],''ratio1'':[1,0.98,0.97]})
test[''date''] = pd.to_datetime(test[''date''])
test = test.set_index(''date'')
ax = test.plot()
ax.xaxis.set_minor_formatter(dates.DateFormatter(''%d/n/n%a'')) ## Added this line
El problema con el segundo gráfico es que comienza en
5-24
lugar de
5-25
.
Además,
5-25
de 2017 es jueves no lunes.
¿Qué está causando el problema?
¿Está relacionada esta zona horaria?
(No entiendo por qué los números de fecha se apilan uno encima del otro tampoco)
En general, las utilidades de fecha y hora de pandas y matplotlib son incompatibles.
Por lo tanto, intentar usar un objeto
matplotlib.dates
en un eje de fecha creado con pandas en la mayoría de los casos fallará.
Una razón se ve, por ejemplo, en la documentación
datetime
objetos dedatetime
se convierten en números de coma flotante que representan el tiempo en días desde 0001-01-01 UTC, más 1 . Por ejemplo, 0001-01-01, 06:00 es 1.25, no 0.25.
Sin embargo, esta no es la única diferencia y, por lo tanto, es aconsejable no mezclar pandas y matplotlib cuando se trata de objetos datetime.
Sin embargo, existe la opción de decirle a los pandas que no usen su propio formato de fecha y hora.
En ese caso, es posible usar los tickers
matplotlib.dates
.
Esto se puede dirigir a través de.
df.plot(x_compat=True)
Dado que los pandas no proporcionan capacidades de formato sofisticadas para fechas, se puede usar matplotlib para trazar y formatear.
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as dates
df = pd.DataFrame({''date'':[''20170527'',''20170526'',''20170525''],''ratio1'':[1,0.98,0.97]})
df[''date''] = pd.to_datetime(df[''date''])
usePandas=True
#Either use pandas
if usePandas:
df = df.set_index(''date'')
df.plot(x_compat=True)
plt.gca().xaxis.set_major_locator(dates.DayLocator())
plt.gca().xaxis.set_major_formatter(dates.DateFormatter(''%d/n/n%a''))
plt.gca().invert_xaxis()
plt.gcf().autofmt_xdate(rotation=0, ha="center")
# or use matplotlib
else:
plt.plot(df["date"], df["ratio1"])
plt.gca().xaxis.set_major_locator(dates.DayLocator())
plt.gca().xaxis.set_major_formatter(dates.DateFormatter(''%d/n/n%a''))
plt.gca().invert_xaxis()
plt.show()