rsj0315 发表于 2023-7-12 22:21:11

计算每天最大值、最小值

该文件的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: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.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'应替换为实际的数据文件路径。

rsj0315 发表于 2023-7-12 22:34:14

第一问是不是可以参考直接将时间按照时区给调10个小时过去,然后用上述代码跑,计算出来的最大和最小就满足了?

第二问想不出方法

歌者文明清理员 发表于 2023-7-12 22:34:51

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

2#

rsj0315 发表于 2023-7-12 22:37:42

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

data['timestamp'] = data['timestamp'] - timedelta(hours=10)
第一问加这个确实计算正确

歌者文明清理员 发表于 2023-7-12 22:55:54

rsj0315 发表于 2023-7-12 22:37
data['timestamp'] = data['timestamp'] - timedelta(hours=10)
第一问加这个确实计算正确

2# 我的答案对吗

rsj0315 发表于 2023-7-12 23:06:44

歌者文明清理员 发表于 2023-7-12 22:33
问题一的代码解答如下:

问题二的代码解答如下:


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

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

也就是11日最大值,你的代码取得是11日24h的,实际应该取12日10时的

歌者文明清理员 发表于 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.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交出来吧,不然不好测试代码对没对

rsj0315 发表于 2023-7-12 23:10:46

歌者文明清理员 发表于 2023-7-12 22:33
问题一的代码解答如下:

问题二的代码解答如下:


第二段找的时间也是24h的,也不对劲

歌者文明清理员 发表于 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)
这样,计算的最大值和最小值将会是按照白班和夜班划分的数据。对于问题二,我们只需要按照设定的时间分界线将数据划分为白班和夜班。非常抱歉给您带来的困惑,希望这次的修正能达到您的需求。如果还有任何问题,请随时告诉我。

rsj0315 发表于 2023-7-12 23:13:45

歌者文明清理员 发表于 2023-7-12 23:07
非常抱歉给出的代码有误。以下是修正后的代码:

python


csv在提问的压缩包里呢,你这个回答还是有瑕疵,正常df是两行结果一个11日的,一个12日的,现在只给了12日的数据

rsj0315 发表于 2023-7-12 23:16:30

看图片中的压缩吧位置,你那看不到吗

歌者文明清理员 发表于 2023-7-12 23:18:09

rsj0315 发表于 2023-7-12 23:16
看图片中的压缩吧位置,你那看不到吗

抱歉

歌者文明清理员 发表于 2023-7-12 23:56:27

无法完成您的任务……

rsj0315 发表于 2023-7-13 10:06:58

昨天思考了一下分班次的之所以计算不对是将夜里24h这个日期分在了某一段时间里,这时候去查找最大最小时,经常找到24h的值。
换个思路:
其实可以将当前时间按照2班时间的起点10点进行调整。直接将读取的时间向前平移10h,这样计算起点是0h开始,12h结束为一段,12h-24h为一段。分别去找对应的最值可能就简单了。
回头有时间验证下。

阿奇_o 发表于 2023-7-13 12:14:39

本帖最后由 阿奇_o 于 2023-7-13 12:17 编辑

rsj0315 发表于 2023-7-13 10:06
昨天思考了一下分班次的之所以计算不对是将夜里24h这个日期分在了某一段时间里,这时候去查找最大最小时, ...

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

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

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

搞不定的话,可以加我V或Q,细说(请我喝杯奶茶~ ^_

rsj0315 发表于 2023-7-13 16:47:38

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

程序员多喝水,老喝奶茶不利于健康{:5_95:}
页: [1]
查看完整版本: 计算每天最大值、最小值