鱼C论坛

 找回密码
 立即注册
查看: 1988|回复: 16

计算每天最大值、最小值

[复制链接]
发表于 2023-7-12 22:21:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
该文件的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)

ElectricMeterDB.zip (15.06 KB, 下载次数: 2)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-12 22:33:02 | 显示全部楼层
本帖最后由 歌者文明清理员 于 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[data['timestamp'].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'应替换为实际的数据文件路径。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-12 22:34:14 | 显示全部楼层
第一问是不是可以参考直接将时间按照时区给调10个小时过去,然后用上述代码跑,计算出来的最大和最小就满足了?

第二问想不出方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-12 22:34:51 | 显示全部楼层
rsj0315 发表于 2023-7-12 22:34
第一问是不是可以参考直接将时间按照时区给调10个小时过去,然后用上述代码跑,计算出来的最大和最小就满足 ...

2#
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-12 22:37:42 | 显示全部楼层
rsj0315 发表于 2023-7-12 22:34
第一问是不是可以参考直接将时间按照时区给调10个小时过去,然后用上述代码跑,计算出来的最大和最小就满足 ...

data['timestamp'] = data['timestamp'] - timedelta(hours=10)
第一问加这个确实计算正确
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-12 22:55:54 | 显示全部楼层
rsj0315 发表于 2023-7-12 22:37
data['timestamp'] = data['timestamp'] - timedelta(hours=10)
第一问加这个确实计算正确

2# 我的答案对吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-12 23:06:44 | 显示全部楼层
歌者文明清理员 发表于 2023-7-12 22:33
问题一的代码解答如下:

问题二的代码解答如下:

第一问答案不对,实际7-11最大和最小应该是537770-----535310

你的代码跑出来的是537058------535310

也就是11日最大值,你的代码取得是11日24h的,实际应该取12日10时的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-12 23:07:51 | 显示全部楼层
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[data['timestamp'].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交出来吧,不然不好测试代码对没对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-12 23:10:46 | 显示全部楼层
歌者文明清理员 发表于 2023-7-12 22:33
问题一的代码解答如下:

问题二的代码解答如下:

第二段找的时间也是24h的,也不对劲
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-12 23:12:01 | 显示全部楼层
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)
这样,计算的最大值和最小值将会是按照白班和夜班划分的数据。对于问题二,我们只需要按照设定的时间分界线将数据划分为白班和夜班。非常抱歉给您带来的困惑,希望这次的修正能达到您的需求。如果还有任何问题,请随时告诉我。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-12 23:13:45 | 显示全部楼层
歌者文明清理员 发表于 2023-7-12 23:07
非常抱歉给出的代码有误。以下是修正后的代码:

python

csv在提问的压缩包里呢,你这个回答还是有瑕疵,正常df是两行结果一个11日的,一个12日的,现在只给了12日的数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-12 23:16:30 | 显示全部楼层
看图片中的压缩吧位置,你那看不到吗
Snipaste_2023-07-12_23-16-00.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-12 23:18:09 | 显示全部楼层
rsj0315 发表于 2023-7-12 23:16
看图片中的压缩吧位置,你那看不到吗

抱歉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-12 23:56:27 | 显示全部楼层
无法完成您的任务……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-13 10:06:58 | 显示全部楼层
昨天思考了一下分班次的之所以计算不对是将夜里24h这个日期分在了某一段时间里,这时候去查找最大最小时,经常找到24h的值。
换个思路:
其实可以将当前时间按照2班时间的起点10点进行调整。直接将读取的时间向前平移10h,这样计算起点是0h开始,12h结束为一段,12h-24h为一段。分别去找对应的最值可能就简单了。
回头有时间验证下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-13 12:14:39 | 显示全部楼层
本帖最后由 阿奇_o 于 2023-7-13 12:17 编辑
rsj0315 发表于 2023-7-13 10:06
昨天思考了一下分班次的之所以计算不对是将夜里24h这个日期分在了某一段时间里,这时候去查找最大最小时, ...


是的,就是这个思路(一般两班倒/三班倒都是以第一个班为0点计算起的,这样方便财务和统一说法是哪一天上班)。

我已经算出来了,还挺有意思的,也让我对Timestamp对象有了更多认识。

你先做做看吧,应该至少会遇到两个比较“狡猾”或者“细节”的问题,一不小心可能会卡在那。。

搞不定的话,可以加我V或Q,细说(请我喝杯奶茶~ ^_
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-13 16:47:38 | 显示全部楼层
阿奇_o 发表于 2023-7-13 12:14
是的,就是这个思路(一般两班倒/三班倒都是以第一个班为0点计算起的,这样方便财务和统一说法是哪一天 ...

程序员多喝水,老喝奶茶不利于健康
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 09:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表