我有一个带有日期和质量虚拟(0或1)的数据框:

      unixTimestamp         date     quality
 0       1370131200   06 2, 2013           1
 1       1290643200  11 25, 2010           1
 2       1283990400   09 9, 2010           1
 3       1290556800  11 24, 2010           1
 4       1317254400  09 29, 2011           1
 5       1388707200   01 3, 2014           1
 6       1398556800  04 27, 2014           1
 7       1399161600   05 4, 2014           0
 8       1405036800  07 11, 2014           1
 9       1390176000  01 20, 2014           1
 10      1397606400  04 16, 2014           1


我想做的是:随时间绘制quality中yes(1)的频率。

我试过的:绘制像这样的直方图:

plt.hist(x=df.loc[df['quality'] == 1].unixTimestamp, bins=78)
plt.show()


我选择78是因为quality等于1的最新日期是1405123200,最早的日期是1203379200。这分别转换为2014年7月12日和2008年2月19日。两者之间的差是78个月。
结果输出非常混乱:

python - 如何绘制时间序列中事件的频率?-LMLPHP

有人可以告诉我如何在散点图上绘制此趋势吗?我仅使用unixTimestamp。非常欢迎提出一种更好的方法来处理时间序列数据。

另外,它在df的170行上运行。实际数据有约1000万行。有人还能提出代表数据的最佳方法吗?提前致谢!

最佳答案

您似乎希望按日期对观察结果进行分组,然后按质量将其等于1的每个期间(天,月,...)内的行数分组。

该工作在pandas中用于.groupby方法。在进行分组之前,让我们确保python也可以识别日期。

import pandas as pd

df['alt_date'] = pd.to_datetime(df['unixTimestamp'], unit='s')
daily_quality = df.groupby('alt_date')['quality'].sum()


现在,您可以使用pd.DataFrame.plot()绘制结果,它使用matplotlib轻松地从pandas数据框中绘制图:

import matplotlib.pyplot as plt

daily_quality.plot(kind='bar')
plt.show()


如果您希望按月对日期进行分组,则可以使用pd.Grouper(),它的工作方式如下:

monthly_quality = df.groupby(pd.Grouper(key='alt_date', freq='M'))['quality']
                    .sum()
                    .fillna(0)   # in case you have missing months

monthly_quality.plot(kind='bar')
plt.show()

关于python - 如何绘制时间序列中事件的频率?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53945708/

10-15 01:04
查看更多