使用Pandas的每小时日期时间直方图

时间:2016-01-15 15:35:55

标签: python datetime pandas

假设我在datetime中有一个pandas.DataFrame的时间戳列。例如,时间戳以秒为单位分辨率。我想在10分钟[1]水桶/垃圾箱中装箱/垃圾箱。我知道我可以将datetime表示为整数时间戳,然后使用直方图。有更简单的方法吗?内置于pandas的东西?

[1] 10分钟只是一个例子。最终,我想使用不同的分辨率。

1 个答案:

答案 0 :(得分:16)

要使用“10分钟”之类的自定义频率,您必须使用TimeGrouper - 按照@johnchase的建议 - 对index进行操作。

# Generating a sample of 10000 timestamps and selecting 500 to randomize them
df = pd.DataFrame(np.random.choice(pd.date_range(start=pd.to_datetime('2015-01-14'),periods = 10000, freq='S'), 500),  columns=['date'])
# Setting the date as the index since the TimeGrouper works on Index, the date column is not dropped to be able to count
df.set_index('date', drop=False, inplace=True)
# Getting the histogram
df.groupby(pd.TimeGrouper(freq='10Min')).count().plot(kind='bar')

enter image description here

使用to_period

也可以使用to_period方法,但据我所知,它不起作用,使用自定义句点,如“10Min”。此示例使用其他列来模拟项目的类别。

# The number of sample
nb_sample = 500
# Generating a sample and selecting a subset to randomize them
df = pd.DataFrame({'date': np.random.choice(pd.date_range(start=pd.to_datetime('2015-01-14'),periods = nb_sample*30, freq='S'), nb_sample),
                  'type': np.random.choice(['foo','bar','xxx'],nb_sample)})

# Grouping per hour and type
df = df.groupby([df['date'].dt.to_period('H'), 'type']).count().unstack()
# Droping unnecessary column level
df.columns = df.columns.droplevel()
df.plot(kind='bar')

enter image description here