【问题标题】:Python: extract rows from pandas dataframe every fixed time windowPython:每个固定时间窗口从熊猫数据框中提取行
【发布时间】:2015-12-23 18:38:17
【问题描述】:

我有以下数据框:

df=
    Record_ID       Time
        94704   2014-03-10 07:19:19.647342
        94705   2014-03-10 07:21:44.479363
        94706   2014-03-10 07:21:45.479581
        94707   2014-03-10 07:21:54.481588
        94708   2014-03-10 07:21:55.481804
        94709   2014-03-10 07:21:56.482029
        94710   2014-03-10 07:21:57.482254
        94711   2014-03-10 07:21:58.482473
        94712   2014-03-10 07:21:59.482706
        94713   2014-03-10 07:22:00.482917
        94714   2014-03-10 07:22:01.483279
        94715   2014-03-10 07:22:02.483545
        94716   2014-03-10 07:22:03.383563
        94717   2014-03-10 07:22:04.383786
        94718   2014-03-10 07:22:09.485624
        94719   2014-03-10 07:22:10.385118
        94720   2014-03-10 07:22:11.485454
        94721   2014-03-10 07:22:12.485592
        94722   2014-03-10 07:22:15.486335
        94723   2014-03-10 07:22:16.486475
        94724   2014-03-10 07:22:17.487023
        94725   2014-03-10 07:22:18.387020
        94726   2014-03-10 07:22:19.387120
        94727   2014-03-10 07:22:20.387379
        94728   2014-03-10 07:22:22.387786
        94729   2014-03-10 07:22:23.488032
        94730   2014-03-10 07:22:24.388232
        94731   2014-03-10 07:22:30.489594

我想知道如何创建一个每 60 秒获取一次数据的新数据框,以减小表的大小。

【问题讨论】:

  • 这个新的 DF 实际上会是什么样子?
  • 它看起来像 df 但行数更少。
  • 您希望以分钟 ('T') 频率重新采样,但您需要指定如何完成重新采样。 'first'、'last'、'mean'、'sum'...
  • 我明白了,“第一”应该没问题

标签: python pandas time dataframe


【解决方案1】:

您首先需要将索引设置为 DataFrame 中的 Time 列。然后你重新采样如下:

resampled = df.set_index('Time').resample('1min', how='first')
>>> resampled
                     Record_ID
Time                          
2014-03-10 07:19:00      94704
2014-03-10 07:20:00        NaN
2014-03-10 07:21:00      94705
2014-03-10 07:22:00      94713

请注意,您会在 07:20 收到 NaN,因为在此时间间隔内没有记录。当然,如果需要,您可以删除 NaN。

>>> resampled.dropna()
                     Record_ID
Time                          
2014-03-10 07:19:00      94704
2014-03-10 07:21:00      94705
2014-03-10 07:22:00      94713

【讨论】:

  • 谢谢,它可以工作,但最后很多点都丢失了。然而,这是一个很好的解决方案
  • 在不了解您的数据的情况下很难提供进一步的建议。或许您可以使用mean 代替first,或者在该时间段内没有可用数据?
  • 您好,这种方法非常适合我的目的。再次感谢您。
【解决方案2】:

我在这里选择了一个名为 roundTime 的函数: How to round the minute of a datetime object python

我将您的示例数据放在一个名为 data.csv 的文件中

import datetime


def roundTime(dt=None, roundTo=60):
   """Round a datetime object to any time laps in seconds
   dt : datetime.datetime object, default now.
   roundTo : Closest number of seconds to round to, default 1 minute.
   Author: Thierry Husson 2012 - Use it as you want but don't blame me.
   """
   if dt == None : dt = datetime.datetime.now()
   seconds = (dt - dt.min).seconds
   # // is a floor division, not a comment on following line:
   rounding = (seconds+roundTo/2) // roundTo * roundTo
   return dt + datetime.timedelta(0,rounding-seconds,-dt.microsecond)

df = pd.read_csv('data.csv')
df['Time'] = pd.to_datetime(df['Time'])
df['Time'] = df['Time'].map(lambda x : roundTime(x))

# now group by Time and select say the first record
print df.groupby('Time').min()

如果你不想分组,这里是一个替代方法

df['Time'] = pd.to_datetime(df['Time'])
df['Time'] = df['Time'].map(lambda x : roundTime(x))
slice_critera =  df['Time'].diff() !=0
print df[slice_critera]

【讨论】:

    猜你喜欢
    • 2016-08-23
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 2017-06-26
    • 2021-05-25
    • 2017-07-03
    相关资源
    最近更新 更多