在带有时间戳索引的数据框中创建一个 12 小时的循环
Posted
技术标签:
【中文标题】在带有时间戳索引的数据框中创建一个 12 小时的循环【英文标题】:Creating a loop of 12 hours in dataframe with timestamp index 【发布时间】:2020-02-27 13:14:54 【问题描述】:df['index_day'] = df.index.floor('d')
我的数据框是df.head
index_day P2_Qa ... P2_Qcon P2_m
2019-01-10 17:00:00 2019-01-10 93.599342 ... 107.673342 14.962424
2019-01-10 17:01:00 2019-01-10 90.833884 ... 104.658384 14.343642
2019-01-10 17:02:00 2019-01-10 90.907001 ... 104.601001 14.568892
2019-01-10 17:03:00 2019-01-10 93.579973 ... 107.115473 14.884902
2019-01-10 17:04:00 2019-01-10 93.688072 ... 107.168072 14.831412
我每天都在循环
for day, i in df.groupby('index_day'):
sns.jointplot(x='P2_Tam', y='P2_Qa', data=i, kind='reg')
j=j+1
plt.savefig(j+'.png')
这给了我一天 24 小时的回归图。但是,我只想要这样的情节。从 18:00 到早上 6 点,one night = one loop= 1 plot
循环大约 12 小时。
但是,我想循环使用 one loop = 18:00 till 6:00 of next day
而不是 one loop=24 hours of one day
。我该怎么做?
【问题讨论】:
你能在问题中添加一些示例数据minimal, complete, and verifiable example吗? 我到底想做什么清楚吗?谢谢 【参考方案1】:我认为您可以先过滤 DataFrame.between_time
仅用于夜间,然后循环使用 12H
和 base=6
:
rng = pd.date_range('2017-04-03', periods=35, freq='H')
df = pd.DataFrame('a': range(35), index=rng)
df = df.between_time('18:00:01', '6:00')
print (df)
a
2017-04-03 00:00:00 0
2017-04-03 01:00:00 1
2017-04-03 02:00:00 2
2017-04-03 03:00:00 3
2017-04-03 04:00:00 4
2017-04-03 05:00:00 5
2017-04-03 06:00:00 6
2017-04-03 19:00:00 19
2017-04-03 20:00:00 20
2017-04-03 21:00:00 21
2017-04-03 22:00:00 22
2017-04-03 23:00:00 23
2017-04-04 00:00:00 24
2017-04-04 01:00:00 25
2017-04-04 02:00:00 26
2017-04-04 03:00:00 27
2017-04-04 04:00:00 28
2017-04-04 05:00:00 29
2017-04-04 06:00:00 30
for i, g in df.groupby(pd.Grouper(freq='12H', base=6, closed='right')):
if not g.empty:
print (g)
a
2017-04-03 00:00:00 0
2017-04-03 01:00:00 1
2017-04-03 02:00:00 2
2017-04-03 03:00:00 3
2017-04-03 04:00:00 4
2017-04-03 05:00:00 5
2017-04-03 06:00:00 6
a
2017-04-03 19:00:00 19
2017-04-03 20:00:00 20
2017-04-03 21:00:00 21
2017-04-03 22:00:00 22
2017-04-03 23:00:00 23
2017-04-04 00:00:00 24
2017-04-04 01:00:00 25
2017-04-04 02:00:00 26
2017-04-04 03:00:00 27
2017-04-04 04:00:00 28
2017-04-04 05:00:00 29
2017-04-04 06:00:00 30
编辑:
如果想在开始时间后 12 小时内选择一种可能的解决方案,DataFrame.truncate
:
rng = pd.date_range('2017-04-03', periods=35, freq='2H')
df = pd.DataFrame('a': range(35), index=rng)
dates = df.index.floor('d').unique()
for s, e in zip(dates + pd.Timedelta(18, unit='H'),
dates + pd.Timedelta(30, unit='H')):
df1 = df.truncate(s, e)
if not df1.empty:
print (df1)
a
2017-04-03 18:00:00 9
2017-04-03 20:00:00 10
2017-04-03 22:00:00 11
2017-04-04 00:00:00 12
2017-04-04 02:00:00 13
2017-04-04 04:00:00 14
2017-04-04 06:00:00 15
a
2017-04-04 18:00:00 21
2017-04-04 20:00:00 22
2017-04-04 22:00:00 23
2017-04-05 00:00:00 24
2017-04-05 02:00:00 25
2017-04-05 04:00:00 26
2017-04-05 06:00:00 27
a
2017-04-05 18:00:00 33
2017-04-05 20:00:00 34
【讨论】:
但是,如果不能选择设置频率怎么办?我正在对数据进行夜间分析,在冬季,欧洲的夜晚并不完全是 12 小时,而是更长。所以设置频率 12H 不是一个选项。我想遍历数据,其中一个循环 = 从下一个日期的 16:00 到 8:00 的 16 小时。然后怎样呢?谢谢 完美!!非常感谢。你是 *** 的无名英雄。干杯!! :)以上是关于在带有时间戳索引的数据框中创建一个 12 小时的循环的主要内容,如果未能解决你的问题,请参考以下文章
Python Multiindex - 如何在只有时间作为索引的数据框中创建分层多索引?
如何从带有额外分隔符的 csv 在 python 中创建 pandas 数据框?