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
以处理您的数据
为了简要概述正在发生的事情,我正在观察温度波动,并且仅在温度波动的办公室中从室内和室外温度过滤数据。这些波动只发生在早上和晚上,因为白天温度是受控的。我将使用 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
以处理您的数据