繁体   English   中英

怎么算没有。 pandas 中时间间隔(每小时)之间的行数?

[英]How to count no. of rows between time intervals(hourly) in pandas?

我的数据有各种列,包括日期和时间列。 数据跨越三个月。 我需要数一下。 与日期无关的特定小时内的行数。 所以这意味着在 00:00 到 01:00 window 和类似的 rest 23 小时内获取行数。 我怎么做? 总的来说,我将有 24 行的计数。 这是我的数据:

>>>df[["date","time"]]

    date    time
0   2006-11-10  00:01:21
1   2006-11-10  00:02:26
2   2006-11-10  00:02:38
3   2006-11-10  00:05:38
4   2006-11-10  00:05:38

Output 应该像:

00:00-00:59 SomeCount

两者都是 object 类型

我认为最简单的是将两列都转换为日期时间,并通过Series.dt.hourSeries.value_counts来计算小时数:

out = pd.to_datetime(df["date"] + ' ' + df["time"]).dt.hour.value_counts().sort_index()

或者,如果需要您的格式,请使用Series.dt.strftimeGroupBy.size

s = pd.to_datetime(df["date"] + ' ' + df["time"]).dt.strftime('%H:00-%H:59')
print (s)
0    00:00-00:59
1    00:00-00:59
2    00:00-00:59
3    00:00-00:59
4    00:00-00:59
dtype: object

out = s.groupby(s, sort=False).size()
print (out)

00:00-00:59    5
dtype: int64

最后为 DataFrame 使用:

df = out.rename_axis('times').reset_index(name='count')

您可以使用分隔符:分割时间字符串。 然后为小时创建另一个列hour 然后使用groupby()根据新列hour对它们进行分组。 您现在可以将数据存储在新系列或 dataframe 中以获得所需的 output

  • groupby()小时
  • 然后构建具有您想要的值的 DF
  • 清理索引和列名
import io
df = pd.read_csv(io.StringIO("""    date    time
0   2006-11-10  00:01:21
1   2006-11-10  00:02:26
2   2006-11-10  00:02:38
3   2006-11-10  00:05:38
4   2006-11-10  02:05:38"""), sep="\s\s+", engine="python")

dfc = (df.groupby(pd.to_datetime(df.time).dt.hour)
 .apply(lambda d: pd.DataFrame({"count":[len(d)]}, 
                               index=[pd.to_datetime(d["time"]).min().strftime("%H:%M")
                                      +"-"+pd.to_datetime(d["time"]).max().strftime("%H:%M")]))
 .reset_index()
 .drop(columns=["time"])
 .rename(columns={"level_1":"time"})
)
时间 数数
0 00:01-00:05 4
1 02:05-02:05 1

我的解决方案生成所有24 小时的行计数,源 DataFrame 中“不存在”的小时数为0

为了展示一个更有启发性的例子,我定义了源 DataFrame 包含几个小时的行:

         date      time
0  2006-11-10  01:21:00
1  2006-11-10  02:26:00
2  2006-11-10  02:38:00
3  2006-11-10  05:38:00
4  2006-11-10  05:38:00
5  2006-11-11  05:43:00
6  2006-11-11  05:51:00

请注意,最后 2 行来自不同的日期,但由于您只想按小时分组,它们将被计入与前 2 行(小时5 )相同的组中。

第一步是创建一个包含几乎你想要的东西的系列

wrk = df.groupby(pd.to_datetime(df.time).dt.hour).apply(
    lambda grp: grp.index.size).reindex(range(24), fill_value=0)

wrk的初始部分是:

time
0     0
1     1
2     2
3     0
4     0
5     4
6     0
7     0

左列(索引)包含作为integer的小时,右列是计数 - 这个小时有多少行。

唯一要做的就是将索引重新格式化为您想要的格式:

wrk.index = wrk.index.map(lambda h: f'{h:02}:00-{h:02}:59')

结果(仅初始部分)是:

time
00:00-00:59    0
01:00-01:59    1
02:00-02:59    2
03:00-03:59    0
04:00-04:59    0
05:00-05:59    4
06:00-06:59    0
07:00-07:59    0

但是,如果您只想获取源数据中存在的小时数,请从上面的代码中删除.reindex(…)

那么您的(完整)结果,对于上述 DataFrame 将是:

time
01:00-01:59    1
02:00-02:59    2
05:00-05:59    4
dtype: int64

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM