如何计算Pandas数据框中特定日期和时间的平均水平

klh5stk1  于 2023-02-06  发布在  其他
关注(0)|答案(3)|浏览(102)

我有一个这样的数据框
| 日期时间|级别|
| - ------|- ------|
| 2017年8月8日23时55分01秒|二百三十九点零万|
| 2017年8月8日23时50分01秒|二百四十二点零|
| 2017年8月8日23时45分01秒|二百四十六点零|
| 2017年8月8日23时40分01秒|二百五十元|
| 2017年8月8日23时35分01秒|二百五十四元|
| ...|...|
| 2017年7月26日00:23:57|七十二岁|
| 2017年7月26日00时18分57秒|六十七岁|
| 2017年7月26日00:13:57|六十四岁|
| 2017年7月26日00:08:57|六十四岁|
| 2017年7月26日00:03:57|六十五岁|
我想计算每天的平均水平,包括清醒时间和夜间时间
| 日期|时间|平均水平|
| - ------|- ------|- ------|
| 2017年8月8日|00时00分至06时00分|一百七十八|
| 2017年8月8日|06:00:01 - 23:59:99|一百九十|
| 2017年9月8日|00时00分至06时00分|一百七十四|
| 2017年9月8日|06:00:01 - 23:59:99|二百|
我已经尝试过拆分为单独的表并使用for循环,但是这会占用太多内存和时间

wmvff8tz

wmvff8tz1#

您可以执行以下操作:

import pandas as pd

df = pd.read_csv("data.csv", sep=";")
print(df)
df["Date_Time"] = pd.to_datetime(df["Date_Time"])

df["Date"] = df["Date_Time"].dt.date
df["Time"] = df["Date_Time"].dt.time

df["Time_Period"] = "Overnight"
df.loc[(df["Time"] >= pd.to_datetime("06:00:00").time()) & (df["Time"] <= pd.to_datetime("23:59:59").time()), "Time_Period"] = "Waking"

grouped = df.groupby(["Date", "Time_Period"])["Level"].mean().reset_index()

grouped = grouped.rename(columns={"Date": "Date", "Time_Period": "Time", "Level": "AvgLevel"})

grouped["Time"] = grouped["Time"].map({
    "Waking": "06:00:01 - 23:59:99",
    "Overnight": "00:00:00 - 06:00:00"
})

print(grouped)

基本上,您可以按每晚和每天的时间对条目进行分组:
这将导致(我假设您打印的预期结果是针对整个 Dataframe 的):

Date                 Time  AvgLevel
0  2017-07-26  00:00:00 - 06:00:00      66.4
1  2017-08-08  06:00:01 - 23:59:99     246.2
tkclm6bt

tkclm6bt2#

您可以使用np.where来区分清醒时间和夜间时间
创建示例数据

data = {
    'Date_Time': [
        '2017-08-08 00:00:00', '2017-08-08 23:50:01', '2017-08-08 06:45:01',
        '2017-08-08 06:00:00', '2017-08-08 00:35:01',
        '2017-07-26 00:23:57', '2017-07-26 00:18:57', '2017-07-26 07:13:57',
        '2017-07-26 00:08:57', '2017-07-26 07:03:57'
    ],
    'Level': [239.0, 242.0, 246.0, 250.0, 254.0, 72.0, 67.0, 64.0, 64.0, 65.0]
}

df = pd.DataFrame(data, columns=['Date_Time', 'Level'])
df['Date_Time'] = pd.to_datetime(df['Date_Time'])
df = df.set_index('Date_Time')
print(df)

                     Level
Date_Time                 
2017-08-08 00:00:00  239.0
2017-08-08 23:50:01  242.0
2017-08-08 06:45:01  246.0
2017-08-08 06:00:00  250.0
2017-08-08 00:35:01  254.0
2017-07-26 00:23:57   72.0
2017-07-26 00:18:57   67.0
2017-07-26 07:13:57   64.0
2017-07-26 00:08:57   64.0
2017-07-26 07:03:57   65.0

创造一个醒着和过夜的面具

mask = (df.index.time >= pd.to_datetime('00:00:00').time()) & (df.index.time <= pd.to_datetime('06:00:00').time())
df['Period'] = np.where(mask, '00:00:00 - 06:00:00', '06:00:01 - 23:59:59')
df

                     Level               Period
Date_Time                                      
2017-08-08 00:00:00  239.0  00:00:00 - 06:00:00
2017-08-08 23:50:01  242.0  06:00:01 - 23:59:59
2017-08-08 06:45:01  246.0  06:00:01 - 23:59:59
2017-08-08 06:00:00  250.0  00:00:00 - 06:00:00
2017-08-08 00:35:01  254.0  00:00:00 - 06:00:00
2017-07-26 00:23:57   72.0  00:00:00 - 06:00:00
2017-07-26 00:18:57   67.0  00:00:00 - 06:00:00
2017-07-26 07:13:57   64.0  06:00:01 - 23:59:59
2017-07-26 00:08:57   64.0  00:00:00 - 06:00:00
2017-07-26 07:03:57   65.0  06:00:01 - 23:59:59

Date_TimePeriod列分组并计算平均值Level

result = df.groupby([df.index.date, 'Period'])['Level'].mean().reset_index()
result.columns = ['Date', 'Time', 'AvgLevel']
result

         Date                 Time    AvgLevel
0  2017-07-26  00:00:00 - 06:00:00   67.666667
1  2017-07-26  06:00:01 - 23:59:59   64.500000
2  2017-08-08  00:00:00 - 06:00:00  247.666667
3  2017-08-08  06:00:01 - 23:59:59  244.000000
daupos2t

daupos2t3#

通过使用Pandas freq选项,可以计算相等时间部分的平均值、总和等,即freq='H'用于每小时计算,freq='12H'用于12小时计算,freq='D'用于每日计算,freq='BH'用于营业时间计算。示例如下:

avg_12_hours = df.groupby(pd.Grouper(freq='12H', key='Date_Time'))['Level'].mean()

由于您要求的计算期间不是平均分割的,因此需要执行一些自定义计算

相关问题