python - 在 pandas 中重新采样,将日期时间系列拆分为 "n"分钟存储桶并为每个存储桶计数

标签 python pandas datetime

我想将日期时间列表分解为 15(或 10 或 30)分钟的存储桶,并计算每个存储桶中有多少个对象。

理想的输出是一个整数列表,其中每个项目都是 15 分钟存储桶的计数,该列表按原始日期时间顺序从最早到最晚

实际日期和时间本身在此应用程序中并不重要。

日期时间是推文创建日期时间,采用 Twitter 的 native 字符串格式(“%a %b %d %H:%M:%S +0000 %Y”),如下面的数据片段所示。

(如果有帮助的话,将它们转换为 Unix 时间或任何最方便的时间是没有问题的)

数据片段:

['Wed Jul 07 07:39:41 +0000 2021',
 'Wed Jul 07 09:25:06 +0000 2021',
 'Wed Jul 07 10:12:24 +0000 2021',
 'Wed Jul 07 12:03:36 +0000 2021',
 'Wed Jul 07 12:51:56 +0000 2021',
 'Thu Jul 08 18:01:02 +0000 2021',
 'Thu Jul 08 18:02:01 +0000 2021',
 'Thu Jul 08 18:02:40 +0000 2021',
 'Thu Jul 08 18:03:45 +0000 2021',
 'Thu Jul 08 18:04:10 +0000 2021',
 'Thu Jul 08 18:16:05 +0000 2021',
 'Thu Jul 08 18:17:40 +0000 2021',
 'Thu Jul 08 18:22:04 +0000 2021',
 'Thu Jul 08 18:23:02 +0000 2021',
 'Thu Jul 08 18:24:34 +0000 2021',
 'Thu Jul 08 21:07:36 +0000 2021',
 'Fri Jul 09 07:31:41 +0000 2021',
 'Fri Jul 09 07:45:14 +0000 2021',
 'Fri Jul 09 08:37:09 +0000 2021',
 'Fri Jul 09 09:32:22 +0000 2021',
 'Fri Jul 09 10:49:53 +0000 2021',
 'Fri Jul 09 11:33:48 +0000 2021',
 'Fri Jul 09 11:35:02 +0000 2021',
 'Fri Jul 09 11:35:43 +0000 2021',
 'Fri Jul 09 12:41:08 +0000 2021',
 'Fri Jul 09 12:41:37 +0000 2021',
 'Fri Jul 09 12:42:38 +0000 2021',
 'Fri Jul 09 13:26:51 +0000 2021',
 'Fri Jul 09 13:41:18 +0000 2021',
 'Fri Jul 09 13:45:51 +0000 2021',
 'Fri Jul 09 14:03:37 +0000 2021',
 'Fri Jul 09 17:59:09 +0000 2021',
 'Fri Jul 09 19:36:01 +0000 2021',
 'Fri Jul 09 19:40:46 +0000 2021',
 'Sat Jul 10 08:34:06 +0000 2021',
 ...
 ]

我想我可以将所有日期时间转换为 unix 时间并编写一个循环将其分块到 900 秒的桶中,但是当 pandas 似乎有内置的此类事情时,它看起来很笨重。

(我见过例如 Pandas resample timeseries data to 15 mins and 45 mins - using multi-index or column 和 pandas 文档本身,例如 https://pandas.pydata.org/docs/reference/api/pandas.Series.resample.html?highlight=resample#pandas.Series.resample )

所以我已经尝试过了,到目前为止我已经得到了下面的内容,但现在我陷入困境并需要一些帮助。

(我不是专业程序员,这不是类(class)作业或家庭作业,尽管我在过去几年中编写了很多简单的 Python;为了完整起见,这里的目的是创建可以用于驱动合成器(软或硬)来创建 Twitter 用户时间线的声音表示,我只是在修改我能想到的最基本的东西)


# where "x" is a list of datetimes as above

df = pd.DataFrame(x, columns=["created_at"])

df["cti"] = pd.to_datetime(df["created_at"])

dfrs = df.set_index("cti")

qbert = dfrs["created_at"].resample("15T").sum()

print(qbert)

从我对 pandas 文档等的阅读中,我认为这会给我一个输出,其中包含每个存储桶的摘要计数(但我可能会误解或曲解:我不是一个“自然”编码器)

但是我得到的输出是这样的:

    cti
2021-07-07 07:30:00+00:00                       Wed Jul 07 07:39:41 +0000 2021
2021-07-07 07:45:00+00:00                                                    0
2021-07-07 08:00:00+00:00                                                    0
2021-07-07 08:15:00+00:00                                                    0
2021-07-07 08:30:00+00:00                                                    0
                                                   ...                        
2021-08-05 13:45:00+00:00                       Thu Aug 05 13:58:07 +0000 2021
2021-08-05 14:00:00+00:00    Thu Aug 05 14:02:32 +0000 2021Thu Aug 05 14:05...
2021-08-05 14:15:00+00:00    Thu Aug 05 14:20:49 +0000 2021Thu Aug 05 14:23...
2021-08-05 14:30:00+00:00    Thu Aug 05 14:30:59 +0000 2021Thu Aug 05 14:31...
2021-08-05 14:45:00+00:00    Thu Aug 05 14:45:56 +0000 2021Thu Aug 05 14:52...
Freq: 15T, Name: created_at, Length: 2814, dtype: object

所以这不是我所期望的,但我不确定我哪里出了问题,或者我是否为我想做的事情选择了合适的方法。

最佳答案

您几乎已经完成了,但是 sum 会连接字符串。您需要计数:

qbert = dfs["created_at"].resample("15T").count()

关于python - 在 pandas 中重新采样,将日期时间系列拆分为 "n"分钟存储桶并为每个存储桶计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68696629/

相关文章:

python - 如何添加基于列值限制外键数量的 Django 约束?

pandas - 结合 nunique 和 pandas 中的 where

java - 为什么时区模式 "OOOO"不显示完整的 GMT+00 :00 offset format?

c# - 当我在 C# 中使用今天的日期时,为什么时间会变成 0000

python - 加载 JSON 并获取某些数据 (Python)

python - AttributeError scikit learn pipeline 基于类

python - 使用 Pandas Dataframe 仅选择一个日期小于另一个日期的行

ruby-on-rails - 如何检查 Rails 中某个范围内是否包含日期时间?

python - 绘制面积图,如何设置填充不透明度?

python - 如何在条形图顶部添加一条线?