【问题标题】:Pandas -selecting data from last minute of hour for 24hr dataPandas - 从一小时的最后一分钟选择数据以获取 24 小时数据
【发布时间】:2017-05-27 08:55:06
【问题描述】:

这里是熊猫初学者。

我有一个以分钟为单位的 24 小时时间序列,A 列中有一个累积值:

Time                Energy
11-01-2017 10:14    19.14634168
11-01-2017 10:15    19.14702618
11-01-2017 10:16    19.14719065
11-01-2017 10:17    19.14719065
…   
11-01-2017 23:56    19.47694149
11-01-2017 23:57    19.4771605
11-01-2017 23:58    19.47753776
11-01-2017 23:59    19.47801377

我想知道每小时结束时 A 列的值是多少 (dd-mm-yyy hh:59),并将此数据保存在 csv 文件中,并带有添加了额外的列以显示小时。结果如下所示:

   Time             Hour  Energy
   11-01-2017 00:59    1     02.0000000
   11-01-2017 01:59    2     04.1234554
   11-01-2017 02:59    3     06.1234554
   ...
   11-01-2017 23:59    24    19.4780137

我应该根据 59 的秒值迭代时间序列,还是更容易每 60 行提取 A 列中的值,因为总会有 1440 行(1440 分钟)?

【问题讨论】:

    标签: python pandas dataframe time-series


    【解决方案1】:

    你可以使用:

    df.Time = pd.to_datetime(df.Time)
    df['hour'] = df.Time.dt.hour + 1
    df1 = df[df.Time.dt.minute == 59]
    
    print (df1)
                     Time     Energy  hour
    7 2017-11-01 23:59:00  19.478014    24
    

    【讨论】:

    • 谢谢...我在添加“小时”列时遇到了困难。问题是该列实际上并未命名为“时间”;它是空白/索引列。这个怎么参考?使用“索引”而不是“时间”?
    • 完全正确,删除dt - df['hour'] = df.index.hour + 1
    • 如果我只想获取最后一分钟的数据怎么办......stackoverflow.com/questions/52855037/…
    【解决方案2】:

    如果您的时间值是规则的,没有您所说的间隔,您可以使用带有 step arg 的切片语义:

    df.iloc[::60]
    

    如果第一个条目不是第​​一分钟,就像你展示的那样,那么只需偏移第一个 arg:

    df.iloc[45::60]
    

    因为第 14 分钟比第 59 分钟晚 45

    时间

    In [176]:
    s = pd.date_range(dt.datetime(2016,1,1), freq='1min', periods=10000)
    s
    
    Out[176]:
    DatetimeIndex(['2016-01-01 00:00:00', '2016-01-01 00:01:00',
                   '2016-01-01 00:02:00', '2016-01-01 00:03:00',
                   '2016-01-01 00:04:00', '2016-01-01 00:05:00',
                   '2016-01-01 00:06:00', '2016-01-01 00:07:00',
                   '2016-01-01 00:08:00', '2016-01-01 00:09:00',
                   ...
                   '2016-01-07 22:30:00', '2016-01-07 22:31:00',
                   '2016-01-07 22:32:00', '2016-01-07 22:33:00',
                   '2016-01-07 22:34:00', '2016-01-07 22:35:00',
                   '2016-01-07 22:36:00', '2016-01-07 22:37:00',
                   '2016-01-07 22:38:00', '2016-01-07 22:39:00'],
                  dtype='datetime64[ns]', length=10000, freq='T')
    
    In [179]:    
    %timeit s[s.minute == 59]
    %timeit s[::60]
    
    1000 loops, best of 3: 639 µs per loop
    10000 loops, best of 3: 27.5 µs per loop
    

    所以这里的切片速度要快约 20 倍

    【讨论】:

    • 很有趣,谢谢。我已经使用了这种切片和 jezrael 上述建议的组合作为解决方案。
    • @wazzahenry 这取决于此处的索引形式,如果您有常规值,那么切片会更快,但其他解决方案将在寻找平等时起作用
    猜你喜欢
    • 2020-02-04
    • 2016-09-12
    • 2012-11-23
    • 2017-11-12
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2015-06-05
    • 2023-03-21
    相关资源
    最近更新 更多