python - 使用 Pandas Python 计算白天站点中断持续时间

标签 python python-3.x pandas

我正在尝试使用 pandas python 来计算一个月内白天的中断持续时间(即 8 月份的 09:00-21:00 之间)。这是一个示例数据框:

          Adjusted_Down         Adjusted_Up
0   2019-08-11 10:31:00 2019-08-11 10:41:00
1   2019-08-14 00:13:00 2019-08-14 00:17:00
2   2019-08-03 12:02:00 2019-08-03 15:30:00
3   2019-08-21 02:46:00 2019-08-21 02:48:00
4   2019-08-26 03:07:00 2019-08-26 03:19:00
..                  ...                 ...
222 2019-08-25 08:46:00 2019-08-25 09:06:00
223 2019-08-30 18:23:00 2019-08-30 18:33:00
224 2019-08-21 17:23:00 2019-08-21 17:27:00
225 2019-08-27 02:10:00 2019-08-27 02:14:00
226 2019-08-27 23:14:00 2019-08-27 23:20:00

我尝试设置开始时间和结束时间的参数,然后尝试计算两者之间的差异。

data = pd.read_excel('lab.xlsx')
site_open = data[(data.Adjusted_Down >= '09:00:00')]
site_close = data[(data.Adjusted_Down <= '21:00:00')]
data['daytime'] = data['site_open'] - data['site_close']
data['daytime'] = data['daytime']/np.timedelta64(1, 'm')

根据评论,我尝试将其更新为以下内容:

import pandas as pd
from pandas import Timestamp
import pytz
from pytz import all_timezones
import datetime
from datetime import time
from threading import Timer
import time
import xlrd
import xlwt
import numpy as np
import xlsxwriter

data = pd.read_excel('lab.xlsx')
data['duration'] = data['Adjusted_Up'] - data['Adjusted_Down']
data['duration'] = data['duration']/np.timedelta64(1,'m')
s = data.apply(lambda row: pd.date_range(row['Adjusted_Down'], row['Adjusted_Up'], freq='T'), axis=1).explode()
s.dt.time.between(time(9), time(21)).sum()

我预计白天中断的持续时间为 09:00-21:00。我收到的错误是:

Traceback (most recent call last):
  File "E:\Savers\Python\Python3 - Master\lab.py", line 18, in <module>
    s.dt.time.between(time(9), time(21)).sum()
TypeError: 'module' object is not callable

最佳答案

(此答案假设您使用 pandas 0.25 或更高版本)

如果数据不太大,最简单的办法就是按分钟爆炸掉停机时间,统计9:00到21:00之间有多少个:

from datetime import time
s = df.apply(lambda row: pd.date_range(row['Adjusted_Down'], row['Adjusted_Up'], freq='T'), axis=1).explode()
s.dt.time.between(time(9), time(21)).sum()

如果你想按月分组,只需要多做一点工作:

s = df.apply(lambda row: pd.date_range(row['Adjusted_Down'], row['Adjusted_Up'], freq='T'), axis=1).explode()
downtime = pd.DataFrame({
    'Month': s.astype('datetime64[M]'),
    'IsDayTime': s.dt.time.between(time(9), time(21))
})
downtime.groupby('Month')['IsDayTime'].sum()

尚未测试性能。如果您的数据集速度太慢,请告诉我。

关于python - 使用 Pandas Python 计算白天站点中断持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57826027/

相关文章:

python - pd.to_datetime 上的未知字符串格式

Python - 两个日期时间之间的数据子集

python - 如何防止 Python 打印添加换行符或空格?

python - 如何获取文件夹中的所有文件并在 python 中获取它们的 MD5 哈希值?

python - 如何在pandas中删除数据框?

python - 在 Windows 上打印到 NamedTemporaryFile

python - 如何在 Python 中更快、更高效地抓取多个页面

python - 在 Python 中打开一个文件进行输入和输出

python - 如何获取 Pandas 数据帧每行中包含预定义等价类值名称的列?

python - 如何为 Pandas 数据框中的多个不存在的列赋值?