在带有时间戳索引的数据框中创建一个 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 仅用于夜间,然后循环使用 12Hbase=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 数据框?

在配置单元中创建一个带有时间戳作为注释的表

如何使用实际数据帧中两列中的值索引另一个数据帧,从而在实际数据框中创建列

Pandas 将多个数据帧与时间戳索引对齐

如何在mongodb索引中使用自己的时间戳