我有一个包含日期和质量虚拟对象(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个月。由此产生的输出相当混乱:
有人能告诉我如何在散点图上绘制这种趋势吗?我只使用unixTimestamp
。对于处理时间序列数据的更好方法的建议非常受欢迎。
此外,这是在170行df
上运行的。实际数据大约有10M行。还能有人建议表示数据的最佳方式吗?提前感谢!
发布于 2018-12-27 21:33:47
您似乎希望在每个周期内(日、月等)按日期和行数对观察结果进行分组。它们的质量等于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()
https://stackoverflow.com/questions/53945708
复制相似问题