我是Pandas的新手,但我找不到解决此简单问题的方法。
我怎么能够
在[第二天的22h至06h]之间采集数据,
计算它们的最小-最大-最大平均值,
使用自定义标签(如night #1 2017-10-12 22h-06h
night #2 2017-10-13 22h-06h
等)按日在Dataframe中重新采样结果?
数据来自温度探测器的csv文件,速率为每分钟1个,已排序,但开始和结束并不总是干净的,记录速率也不是。有时,它从21:13:00开始,速率为每分钟5。因此,我尝试仅处理日期,而不计算行数。
您可以在下面找到一个模仿该问题的小型设置(我使用递增数字而不是°C的值来检查计算后的平均值):
import pandas as pd
import datetime as dt
import numpy as np
index = pd.date_range('01/11/2017 21:00:00', periods=10000, freq='min')
df = pd.DataFrame(list(range(10000)), columns=['T1'], index=index)
df.index.name='Datetime'
#df
我可以使用between_time从22h到06h提取数据
df_light = df.between_time('22:00','06:00')
#print(df_light.to_string()) #Useful to see the whole list
df_light.head()
T1
Datetime
2017-01-11 22:00:00 60
2017-01-11 22:01:00 61
2017-01-11 22:02:00 62
2017-01-11 22:03:00 63
2017-01-11 22:04:00 64
并使用resample()。agg()
result = df_light.resample('D', base=0).agg(['count','min','max','mean']).round(2)
result.head()
T1
count min max mean
Datetime
2017-01-11 120 60 179 119.50
2017-01-12 481 180 1619 659.25
2017-01-13 481 1620 3059 2099.25
2017-01-14 481 3060 4499 3539.25
2017-01-15 481 4500 5939 4979.25
第一个问题
重新采样会计算当天的所有数据,即[00h01..06h和22h..23h59],而我希望从一天结束到第二天的早晨进行计算,即[22h..06h明天]。
另外,我找不到一种使两者兼而有之的方法。
我使用
base
参数和closed : {‘right’, ‘left’}
搜索,但没有发现任何令人信服的内容。第二个问题
我尝试制作数量不断增加的自定义标签,以查看有多少个夜晚,但是我没办法找到在夜晚之后增加数量的方法(#1,#2,#3等)
result.index = result.index.strftime('night %Y/%m/%d 22h-06h')
result.head()
T1
count min max mean
night 2017/01/11 22h-06h 120 60 179 119.50
night 2017/01/12 22h-06h 481 180 1619 659.25
night 2017/01/13 22h-06h 481 1620 3059 2099.25
night 2017/01/14 22h-06h 481 3060 4499 3539.25
night 2017/01/15 22h-06h 481 4500 5939 4979.25
..如果您认为可以为我解决这两个问题。.欢迎您!非常感谢。
最佳答案
解决第一个问题:
将底数与时间间隔的开始(22:00)匹配,就间隔而言,每秒钟包含有价值的聚合,其他均为NaN,因此使用dropna()
result = (
df_light
.resample('12H', base=22)
.agg(['count','min','max','mean'])
.dropna()
.round(2)
)
result.head()
T1
count min max mean
Datetime
2017-01-11 22:00:00 481 60.0 540.0 300.0
2017-01-12 22:00:00 481 1500.0 1980.0 1740.0
2017-01-13 22:00:00 481 2940.0 3420.0 3180.0
2017-01-14 22:00:00 481 4380.0 4860.0 4620.0
2017-01-15 22:00:00 481 5820.0 6300.0 6060.0
第二个问题的解决方案(稍微复杂一些):
s1 = pd.Series(result.index.strftime('night #{} %Y/%m/%d 22h-06h'))
s2 = pd.Series(range(len(s1))).map(str)
df = pd.concat([s1, s2], axis=1)
new_index = df.apply(lambda x: x[0].format(x[1]), axis=1)
result.index = new_index
result.head()
T1
count min max mean
night #0 2017/01/11 22h-06h 481 60.0 540.0 300.0
night #1 2017/01/12 22h-06h 481 1500.0 1980.0 1740.0
night #2 2017/01/13 22h-06h 481 2940.0 3420.0 3180.0
night #3 2017/01/14 22h-06h 481 4380.0 4860.0 4620.0
night #4 2017/01/15 22h-06h 481 5820.0 6300.0 6060.0
您可以尝试使用新索引的格式,例如使用
range(1, len(s1) + 1)
进行正确计数。