Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将数据帧开始/停止时间转换为百分比存储单元_Python_Pandas_Dataframe_Time Series - Fatal编程技术网

Python 将数据帧开始/停止时间转换为百分比存储单元

Python 将数据帧开始/停止时间转换为百分比存储单元,python,pandas,dataframe,time-series,Python,Pandas,Dataframe,Time Series,我想将开始/结束(或打开/关闭)时间的数据帧转换为第二个数据帧,每个任意时间段的总“打开时间”百分比。在本例中,该时间段为一小时。我已经写了一个涉及循环的非常低效的解决方案,并且正在寻找一个更好的解决方案 df1 | Start | End | |---------------------|---------------------| | 2020-02-01T00:00:00 | 2020-02-01T02:40:00 | | 20

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

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 |

如果数据不太大,一种处理方法是在较低频率和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

如果数据不太大,一种处理方法是在较低频率和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

df1['End'].sub(df1['Start'])/pd.to_timedelta('1H')
?谢谢Quang,但这只告诉我每个开始/结束对的持续时间,并没有解决将“准时”分为一小时的箱子的问题。df2的行数应该与df1的行数不同。(100*timedelta(hours=1)/(df1.End-df1.Start)。重采样('1H').sum())?您能提供一些示例数据吗?谢谢jonnor,帖子中的两个表(df1和df2)是实际数据的一部分。
df1['End'].sub(df1['Start'])/pd.to_timedelta('1H')
?谢谢Quang,但这只告诉我每个开始/结束对的持续时间,并没有解决将“准时”分为一小时长的垃圾箱的问题。df2的行数应该与df1的行数不同。(100*timedelta(hours=1)/(df1.End-df1.Start)。重采样('1H').sum())?你能提供一些示例数据吗?感谢jonnor,文章中的两个表(df1和df2)是实际数据的一部分。这是一个不错的方法,但数据实际上很大(以年为单位)因此,存储行数=秒的数据帧不是我可以接受的方法。很好的方法Quang,但是数据实际上很大(以年为单位),所以存储行数=秒的数据帧不是我可以接受的方法。