Как упорядочить даты на графике в порядке возрастания?
Eсть CSV файл с кол-вом заболевших за прошлый год, но он имеет неверную структуру, т.е. там сначала идет сегодняшняя дата, потом вчерашняя и т.д.
Как построить правильный график, чтобы от прошлого к настоящему, а не наоборот?
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('data.txt')
plt.plot(data['val'])
plt.show()
Пробовал: data = data[::-1]
Ответы (4 шт):
Что-то непонятное вы говорите.
import pandas as pd
import numpy as np
dt=np.arange('2021-02-01', '2021-02-11', dtype='datetime64[D]')
dt1=np.arange(10)
df=pd.DataFrame({'A':dt,'B':dt1})
df1=df[::-1]
ДатаФрейм df - порядок "прямой".
Out[20]:
A B
0 2021-02-01 0
1 2021-02-02 1
2 2021-02-03 2
3 2021-02-04 3
4 2021-02-05 4
5 2021-02-06 5
6 2021-02-07 6
7 2021-02-08 7
8 2021-02-09 8
9 2021-02-10 9
ДатаФрейм df1 - порядок "обратный":
Out[21]:
A B
9 2021-02-10 9
8 2021-02-09 8
7 2021-02-08 7
6 2021-02-07 6
5 2021-02-06 5
4 2021-02-05 4
3 2021-02-04 3
2 2021-02-03 2
1 2021-02-02 1
0 2021-02-01 0
Как видите, все прекрасно "переворачивается" конструкцией df1=df[::-1].
Но если речь идет только о выводе графика без создания промежуточного ДатаФрейма, тогда вот так:
ax.plot(df.A,df.B)
ax.invert_xaxis()
Отсортируйте датафрейм по тому столбцу, где у вас даты. Примерно так:
data = data.sort_values('dt') # ну или как у вас столбец с датой называется
Либо, если даты в индексе:
data = data.sort_index()
Но всё-равно могут быть проблемы, если даты у вас не типа "дата", а виде строк в не очень сортируемом формате каком-то (например MM/DD/YYYY), тогда их лучше перевести сначала в настоящие даты (или хотя бы в хорошо сортируемые строки формата YYYY/MM/DD), а потом уже сортировать.
Если у столбец с датами имеет тип данных datetime64, то Pandas сам позаботится о сортировке значений по оси X.
Пример:
In [105]: df = pd.DataFrame({"DT": pd.date_range('2021-01-01', periods=20), "val": np.random.randint(100, size=20)}).sample(frac=1)
In [106]: df
Out[106]:
DT val
15 2021-01-16 71
2 2021-01-03 23
11 2021-01-12 29
3 2021-01-04 66
0 2021-01-01 52
9 2021-01-10 78
18 2021-01-19 5
12 2021-01-13 64
8 2021-01-09 81
6 2021-01-07 73
13 2021-01-14 85
10 2021-01-11 85
7 2021-01-08 74
1 2021-01-02 49
4 2021-01-05 80
14 2021-01-15 38
19 2021-01-20 98
5 2021-01-06 25
17 2021-01-18 3
16 2021-01-17 69
рисуем средствами Pandas:
In [108]: df.set_index("DT")["val"].plot()
Out[108]: <AxesSubplot:xlabel='DT'>
Спасибо за помощь. Как я говорил, при data1 = data[::-1] при построении графика ничего не меняется, если бы дата была в нормальном формате, можно было бы использовать предложенные вами способы. Я же решил просто перевести в список.
data_val = list(data['val'][::-1])

