【问题标题】:Convert Data Frame Start/Stop times into percentage bins将数据框开始/停止时间转换为百分比箱
【发布时间】:2020-07-08 13:03:03
【问题描述】:

我想将开始/结束(或开/关)时间的数据帧转换为第二个数据帧,其中每个任意时间段的总“开启时间”百分比。在这种情况下,该时间段是一个小时。我已经编写了一个非常低效的解决方案,涉及循环,并且正在寻找更好的解决方案。

df1

| Start               | End                 |
|---------------------|---------------------|
| 2020-02-01T00:00:00 | 2020-02-01T02:40:00 |
| 2020-02-01T02:55:00 | 2020-02-01T03:17:00 |
| 2020-02-01T03:27:00 | 2020-02-01T04:12:00 |
| 2020-02-01T04:20:00 | 2020-02-01T04:29:00 |
| 2020-02-01T05:19:00 | 2020-02-01T05:23:00 |
df2

| Time                | Percent |
|---------------------|---------|
| 2020-02-01T00:00:00 | 1       |
| 2020-02-01T00:01:00 | 1       |
| 2020-02-01T00:02:00 | 0.750   |
| 2020-02-01T00:03:00 | 0.833   |
| 2020-02-01T00:04:00 | 0.350   |
| 2020-02-01T00:05:00 | 0.066   |

【问题讨论】:

  • df1['End'].sub(df1['Start'])/pd.to_timedelta('1H')?
  • 感谢 Quang,但这仅告诉我每个开始/结束对的持续时间,并没有解决将“准时”分解为一小时长的垃圾箱的问题。 df2 的行数预计与 df1 不同。
  • ( 100 * timedelta(hours=1) / (df1.End-df1.Start).resample('1H').sum() )?
  • 你能提供一些示例数据吗?
  • 感谢 jonnor,帖子中的两个表(df1 和 df2)是实际数据的一部分。

标签: python pandas dataframe time-series


【解决方案1】:

如果数据不是太大,解决这个问题的一种方法是在较低频率和 groupby 上重新采样:

s = pd.concat([pd.Series(pd.date_range(a,b, freq='S')) 
                  for a,b in zip(df1.Start, df1.End)],
              ignore_index=True
              )
s.groupby(s.dt.floor('H')).count()/3600

输出:

2020-02-01 00:00:00    1.000000
2020-02-01 01:00:00    1.000000
2020-02-01 02:00:00    0.750278
2020-02-01 03:00:00    0.833611
2020-02-01 04:00:00    0.350556
2020-02-01 05:00:00    0.066944
dtype: float64

【讨论】:

  • Quang 的方法不错,但数据实际上很大(以年为单位),因此存储行数 = 秒的数据帧不是我可以接受的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 2017-06-19
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 2019-05-02
相关资源
最近更新 更多