计算每天最大值、最小值
该文件的DT-DL01#81_DQ701列是数值下列代码是计算出每天的DT-DL01#81_DQ701列的最大值和最小值。
问题一:
如果以上午10点作为分界线,去计算每天的最大值和最小值;也就是上午十点到第二天上午十点前这个周期的内最大值和最小值。
问题二:
如果以上午10点到下午10点为白班,下午10点到第二天上午10点位夜班,如何求出每天每个班次的最大值和最小值。
import pandas as pd
# 读取CSV文件
data = pd.read_csv('your_data.csv')
# 将时间戳列转换为datetime类型
data['timestamp'] = pd.to_datetime(data['timestamp'])
# 提取每天的最大和最小量值行
daily_max_min = data.groupby(data['timestamp'].dt.date)['value'].agg(['max', 'min'])
# 输出结果
print(daily_max_min)
本帖最后由 歌者文明清理员 于 2023-7-12 22:34 编辑
问题一的代码解答如下:
import pandas as pd
# 读取CSV文件
data = pd.read_csv('your_data.csv')
# 将时间戳列转换为datetime类型
data['timestamp'] = pd.to_datetime(data['timestamp'])
# 设置上午10点作为分界线
boundary_time = pd.to_datetime('10:00:00').time()
# 过滤出符合条件的数据
filtered_data = data.dt.time >= boundary_time]
# 提取每天的最大和最小量值行
daily_max_min = filtered_data.groupby(filtered_data['timestamp'].dt.date)['value'].agg(['max', 'min'])
# 输出结果
print(daily_max_min)
问题二的代码解答如下:
import pandas as pd
# 读取CSV文件
data = pd.read_csv('your_data.csv')
# 将时间戳列转换为datetime类型
data['timestamp'] = pd.to_datetime(data['timestamp'])
# 设置上午10点和下午10点作为白班和夜班的分界线
morning_shift_end = pd.to_datetime('10:00:00').time()
night_shift_end = pd.to_datetime('22:00:00').time()
# 根据班次划分数据
morning_shift_data = data[(data['timestamp'].dt.time >= morning_shift_end) & (data['timestamp'].dt.time < night_shift_end)]
night_shift_data = data[(data['timestamp'].dt.time >= night_shift_end) | (data['timestamp'].dt.time < morning_shift_end)]
# 提取每天每个班次的最大和最小量值行
morning_shift_max_min = morning_shift_data.groupby(morning_shift_data['timestamp'].dt.date)['value'].agg(['max', 'min'])
night_shift_max_min = night_shift_data.groupby(night_shift_data['timestamp'].dt.date)['value'].agg(['max', 'min'])
# 输出结果
print("白班最大值和最小值:")
print(morning_shift_max_min)
print("夜班最大值和最小值:")
print(night_shift_max_min)
请注意,以上代码中的'your_data.csv'应替换为实际的数据文件路径。 第一问是不是可以参考直接将时间按照时区给调10个小时过去,然后用上述代码跑,计算出来的最大和最小就满足了?
第二问想不出方法 rsj0315 发表于 2023-7-12 22:34
第一问是不是可以参考直接将时间按照时区给调10个小时过去,然后用上述代码跑,计算出来的最大和最小就满足 ...
2# rsj0315 发表于 2023-7-12 22:34
第一问是不是可以参考直接将时间按照时区给调10个小时过去,然后用上述代码跑,计算出来的最大和最小就满足 ...
data['timestamp'] = data['timestamp'] - timedelta(hours=10)
第一问加这个确实计算正确 rsj0315 发表于 2023-7-12 22:37
data['timestamp'] = data['timestamp'] - timedelta(hours=10)
第一问加这个确实计算正确
2# 我的答案对吗 歌者文明清理员 发表于 2023-7-12 22:33
问题一的代码解答如下:
问题二的代码解答如下:
第一问答案不对,实际7-11最大和最小应该是537770-----535310
你的代码跑出来的是537058------535310
也就是11日最大值,你的代码取得是11日24h的,实际应该取12日10时的 rsj0315 发表于 2023-7-12 23:06
第一问答案不对,实际7-11最大和最小应该是537770-----535310
你的代码跑出来的是537058------535310
...
非常抱歉给出的代码有误。以下是修正后的代码:
python
import pandas as pd
# 读取CSV文件
data = pd.read_csv('your_data.csv')
# 将时间戳列转换为datetime类型
data['timestamp'] = pd.to_datetime(data['timestamp'])
# 设置上午10点作为分界线
boundary_time = pd.to_datetime('10:00:00').time()
# 过滤出符合条件的数据
filtered_data = data.dt.hour < boundary_time.hour]
# 提取每天的最大和最小量值行
daily_max_min = filtered_data.groupby(filtered_data['timestamp'].dt.date)['value'].agg(['max', 'min'])
# 输出结果
print(daily_max_min)
这样,计算的最大值和最小值将会是上午10点之前的数据。对于问题一,我们只需要过滤出timestamp的小时部分小于上午10点的数据即可。再次非常抱歉给您带来的困惑。
另外建议你把csv交出来吧,不然不好测试代码对没对 歌者文明清理员 发表于 2023-7-12 22:33
问题一的代码解答如下:
问题二的代码解答如下:
第二段找的时间也是24h的,也不对劲 rsj0315 发表于 2023-7-12 23:10
第二段找的时间也是24h的,也不对劲
另外建议你把csv放上来吧,不然不好测试代码对没对
非常抱歉给出的代码有误。以下是修正后的代码:
import pandas as pd
# 读取CSV文件
data = pd.read_csv('your_data.csv')
# 将时间戳列转换为datetime类型
data['timestamp'] = pd.to_datetime(data['timestamp'])
# 设置上午10点和下午10点作为白班和夜班的分界线
morning_shift_start = pd.to_datetime('10:00:00').time()
night_shift_start = pd.to_datetime('22:00:00').time()
# 根据班次划分数据
morning_shift_data = data[(data['timestamp'].dt.hour >= morning_shift_start.hour) & (data['timestamp'].dt.hour < night_shift_start.hour)]
night_shift_data = data[(data['timestamp'].dt.hour >= night_shift_start.hour) | (data['timestamp'].dt.hour < morning_shift_start.hour)]
# 提取每天每个班次的最大和最小量值行
morning_shift_max_min = morning_shift_data.groupby(morning_shift_data['timestamp'].dt.date)['value'].agg(['max', 'min'])
night_shift_max_min = night_shift_data.groupby(night_shift_data['timestamp'].dt.date)['value'].agg(['max', 'min'])
# 输出结果
print("白班最大值和最小值:")
print(morning_shift_max_min)
print("夜班最大值和最小值:")
print(night_shift_max_min)
这样,计算的最大值和最小值将会是按照白班和夜班划分的数据。对于问题二,我们只需要按照设定的时间分界线将数据划分为白班和夜班。非常抱歉给您带来的困惑,希望这次的修正能达到您的需求。如果还有任何问题,请随时告诉我。 歌者文明清理员 发表于 2023-7-12 23:07
非常抱歉给出的代码有误。以下是修正后的代码:
python
csv在提问的压缩包里呢,你这个回答还是有瑕疵,正常df是两行结果一个11日的,一个12日的,现在只给了12日的数据 看图片中的压缩吧位置,你那看不到吗 rsj0315 发表于 2023-7-12 23:16
看图片中的压缩吧位置,你那看不到吗
抱歉 无法完成您的任务…… 昨天思考了一下分班次的之所以计算不对是将夜里24h这个日期分在了某一段时间里,这时候去查找最大最小时,经常找到24h的值。
换个思路:
其实可以将当前时间按照2班时间的起点10点进行调整。直接将读取的时间向前平移10h,这样计算起点是0h开始,12h结束为一段,12h-24h为一段。分别去找对应的最值可能就简单了。
回头有时间验证下。 本帖最后由 阿奇_o 于 2023-7-13 12:17 编辑
rsj0315 发表于 2023-7-13 10:06
昨天思考了一下分班次的之所以计算不对是将夜里24h这个日期分在了某一段时间里,这时候去查找最大最小时, ...
是的,就是这个思路(一般两班倒/三班倒都是以第一个班为0点计算起的,这样方便财务和统一说法是哪一天上班)。
我已经算出来了,还挺有意思的,也让我对Timestamp对象有了更多认识。
你先做做看吧,应该至少会遇到两个比较“狡猾”或者“细节”的问题,一不小心可能会卡在那。。
搞不定的话,可以加我V或Q,细说(请我喝杯奶茶~ ^_ 阿奇_o 发表于 2023-7-13 12:14
是的,就是这个思路(一般两班倒/三班倒都是以第一个班为0点计算起的,这样方便财务和统一说法是哪一天 ...
程序员多喝水,老喝奶茶不利于健康{:5_95:}
页:
[1]