Pandas:遍历行,添加和减去日期,根据行值将这些日期附加到新列

Pandas: Iterating over rows, Adding and Subtracting Dates, Appending those dates to a new column depending on row value

为了简要概述正在发生的事情,我正在观察温度波动,并且仅在温度波动的办公室中从室内和室外温度过滤数据。这些波动只发生在早上和晚上,因为白天温度是受控的。我将使用 ANN 从这些波动中学习,并根据其他变量(如 OutdoorTemp、SolarDiffuseRate 等)模拟温度变化需要多长时间

问题一: 我如何逐行迭代,首先,查看时间并添加一个二进制列,其中 0 表示早晨,1 表示夜间。

问题二: 对于每一天,早上和晚上都会有不同长度的系列行,具体取决于温度在 22 度和 17 度之间变化所需的时间。如何为每一天、每天早上和晚上添加一列,其中说明温度从 X 到 Y 所花费的时间。

基本上是加减时间来求差,然后按早上或晚上追加。

                     OfficeTemp  OutdoorTemp  SolarDiffuseRate 
DateTime                                                         
2006-01-01 07:15:00   19.915275       0.8125               0.0   
2006-01-01 07:30:00   20.463506       0.8125               0.0   
2006-01-01 07:45:00   20.885112       0.8125               0.0   
2006-01-01 20:15:00   19.985398       8.3000               0.0   
2006-01-01 20:30:00   19.157857       8.3000               0.0   
...                         ...          ...               ...   
2006-06-30 22:00:00   18.056205      22.0125               0.0   
2006-06-30 22:15:00   17.993072      19.9875               0.0   
2006-06-30 22:30:00   17.929643      19.9875               0.0   
2006-06-30 22:45:00   17.867148      19.9875               0.0   
2006-06-30 23:00:00   17.804429      19.9875               0.0   
df = pd.DataFrame(index=pd.date_range('2006-01-01', '2006-06-30', freq='15min'))
df['OfficeTemp'] = np.random.normal(loc=20, scale=5, size=df.shape[0])
df['OutdoorTemp'] = np.random.normal(loc=12, scale=5, size=df.shape[0])
df['SolarDiffuseRate'] = 0.0

问题 1:

df['PartofDay'] = df.index.hour.map(lambda x: 0 if x < 12 else 1)

对于问题 2,需要定义公差(温度永远不会正好是 17 或 22 度)。

import numpy as np

def temp_change_duration(group):
   tol=0.3
   first_time = group.index[np.isclose(group['OfficeTemp'], 17, atol=tol)][0]
   second_time = group.index[np.isclose(group['OfficeTemp'], 22, atol=tol)][0]
   return(abs(second_time-first_time))

然后将这个函数应用到我们的df:

df.groupby([df.index.day, 'PartofDay']).apply(temp_change_duration)

这将帮助您完成大部分工作,但会使用我生成的正态分布合成数据给出有趣的答案。看看您是否可以调整 temp_change_duration 以处理您的数据