使用pandas使用实际日期绘制时间序列的简单方法

时间:2016-08-08 19:51:09

标签: python pandas plot time-series seaborn

从以下CSV数据开始,加载到pandas数据框......

Buchung;Betrag;Saldo
27.06.2016;-1.000,00;42.374,95
02.06.2016;500,00;43.374,95
01.06.2016;-1.000,00;42.874,95
13.05.2016;-500,00;43.874,95
02.05.2016;500,00;44.374,95
04.04.2016;500,00;43.874,95
02.03.2016;500,00;43.374,95
10.02.2016;1.000,00;42.874,95
02.02.2016;500,00;41.874,95
01.02.2016;1.000,00;41.374,95
04.01.2016;300,00;40.374,95
30.12.2015;234,54;40.074,95
02.12.2015;300,00;39.840,41
02.11.2015;300,00;39.540,41
08.10.2015;1.000,00;39.240,41
02.10.2015;300,00;38.240,41
02.09.2015;300,00;37.940,41
31.08.2015;2.000,00;37.640,41

...我希望用直观的方式绘制“Buchung”栏中日期和“Saldo”栏中的货币值所给出的时间序列。

我试过

seaborn.tsplot(data=data, time="Buchung", value="Saldo")

产生

ValueError: could not convert string to float: '31.08.2015'

阅读日期和值并绘制时间序列的简单方法是什么?我认为这是一个常见的问题,必须有一个三线解决方案。

1 个答案:

答案 0 :(得分:4)

您需要将日期列转换为正确的格式:

data['Buchung'] = pd.to_datetime(data['Buchung'], format='%d.%m.%Y')

现在你的情节会奏效。

虽然您没有问,但我认为您也会遇到类似问题,因为您的号码('Betrag''Saldo')似乎也是字符串。所以我建议你在绘图前将它们转换为数字。以下是通过简单的字符串操作来实现的方法:

data["Saldo"] = data["Saldo"].str.replace('.', '').str.replace(',', '.')
data["Betrag"] = data["Betrag"].str.replace('.', '').str.replace(',', '.')

或设置locale

import locale
# The data appears to be in a European format, German locale might
# fit. Try this on Windows machine:
locale.setlocale(locale.LC_ALL, 'de')
data['Betrag'] = data['Betrag'].apply(locale.atof)
data['Saldo'] = data['Saldo'].apply(locale.atof)
# This will reset the locale to system default
locale.setlocale(locale.LC_ALL, '')

在Ubuntu计算机上,按照this answer进行操作。如果上述代码在Windows计算机上不起作用,请尝试locale.locale_alias列出所有可用的区域设置并从中选择名称。

输出

使用matplotlib,因为我无法在我正在使用的机器上安装Seaborn。

from matplotlib import pyplot as plt

plt.plot(data['Buchung'], data['Saldo'], '-')
_ = plt.xticks(rotation=45)

The Plot

注意:这是使用locale方法生成的。因此月份名称是德语。