我有一个数据帧df
与100,000行使用DateTime索引。以1月份的案例为例。我想创建一个新的列,命名为'Experiment'
,这样可以帮助我识别实验开始和结束的时间,总共有10个实验。
df=
Place
Time
2021-01-01 00:00 home
2021-01-01 00:01 home
2021-01-01 00:02 home
2021-01-01 00:03 home
................ ....
................ ....
2021-01-31 23:57 home
2021-01-31 23:58 home
2021-01-31 23:59 home
例如,实验A从2021-01-01 00:00 and 2021-01-01 00:02
之间开始,实验J从2021-01-31 23:57 and 2021-01-31 23:59
之间开始。预期的结果将是这样的。
df=
Place Experiment
Time
2021-01-01 00:00 home A
2021-01-01 00:01 home A
2021-01-01 00:02 home A
2021-01-01 00:03 home
................ ....
................ ....
2021-01-31 23:57 home J
2021-01-31 23:58 home J
2021-01-31 23:59 home J
我的方法是这样的。
df["experiment"] = ""
df["experiment"] = np.where(df.between_time('2021-01-01 00:00','2021-01-01 00:02'),'A',np.nan)
df["experiment"] = np.where(df.between_time('2021-01-31 23:57','2021-01-31 23:59'),'J',np.nan)
我才意识到between_time
不工作时,包括日期。此外,我面临的问题是the Length of values does not match length of index.
谢谢!
现在使用np.where
将覆盖您已经创建的内容。
对于多个条件,使用.loc
来更新:
# the experiment time
list_starts = ['2021-01-01 00:00','2021-01-31 23:57']
list_ends = ['2021-01-01 00:02', '2021-01-31 23:59']
list_names = ['A','J']
for start_time, end_time, name in zip(list_starts, list_ends, list_names):
df.loc[start_time:end_time, 'experiment'] = name
另一种(更好的)安排实验时间的方法是:
# name: (start, end)
exp_times = {
'A': ('2021-01-01 00:00', '2021-01-01 00:02'),
'J': ('2021-01-31 23:57', '2021-01-31 23:59')
}
for name, (start_time, end_time) in exp_times.items():
df.loc[start_time:end_time, 'experiment'] = name
输出:
Place experiment
Time
2021-01-01 00:00:00 home A
2021-01-01 00:01:00 home A
2021-01-01 00:02:00 home A
2021-01-01 00:03:00 home NaN
2021-01-31 23:57:00 home J
2021-01-31 23:58:00 home J
2021-01-31 23:59:00 home J
注意:您可能已经注意到,您可以使用字符串对时间索引的数据帧进行切片/索引。