【问题标题】:Python (pandas) fast mapping of multiple datetimes to their series indices?Python(熊猫)将多个日期时间快速映射到它们的系列索引?
【发布时间】:2016-04-06 01:09:00
【问题描述】:

我有一个大型 Pandas 数据框,其中一列是已知时期(2013 年)的(无序)日期时间。我需要一种有效的方法将这些日期时间转换为索引,其中每个索引 = # hours since start_time ('2013-1-1 00)'。 重复时间,应该映射到重复索引。

显然,这可以通过使用 timedelta 以循环方式一次完成。也可以使用 Pandas Series 循环完成(参见下面的 sn-p,它生成自 start_time 以来所有日期时间的有序序列):

nhours = 365*24
time_series = Series(range(nhours), index=pd.date_range('2013-1-1', periods=nhours, freq='H'))

运行此 sn-p 后,可以在循环中使用 .index 或 .get_loc 方法获取索引。

** 但是,有没有一种快速(非循环?)的方法来获取任意日期时间列并找到它们各自的索引? **

例如,输入以下列日期时间:

2013-01-01 11:00:00
2013-01-01 11:00:00
2013-01-01 00:00:00
2013-12-30 18:00:00

应该输出以下索引:[11, 11, 0, 8730]

【问题讨论】:

    标签: python datetime optimization pandas series


    【解决方案1】:

    loc 可以获取标签列表或数组来查找:

    >>> print time_series.loc[[pd.Timestamp('20130101 11:00'), pd.Timestamp('20130101 11:00'), pd.Timestamp('20130101'), pd.Timestamp('20131230 18:00')]]
    2013-01-01 11:00:00      11
    2013-01-01 11:00:00      11
    2013-01-01 00:00:00       0
    2013-12-30 18:00:00    8730
    dtype: int64
    

    【讨论】:

      【解决方案2】:

      感谢您的回复。我有一个新的、更快的解决方案,它利用了 pandas 支持 datetime 和 timedelta 格式的事实。事实证明,以下解决方案的速度大约是上述 Colin 解决方案的两倍(尽管不够灵活),并且它避免了构建一系列有序日期时间的开销:

      all_indices = (df['mydatetimes'] - datetime(2013,1,1,0)) / np.timedelta64(1,'h') 
      

      其中 df 是 pandas 数据框,“mydatetimes”是包含日期时间的列名。

      对代码进行计时会得出该解决方案在以下方面执行 30,000 个索引:

      0:00:00.009909 --> 这个 sn-p

      0:00:00.017800 --> Colin 使用 ts=Series(...) 和 ts.loc 的解决方案。我已经从这个时间排除了构建系列的一次性开销

      【讨论】:

        【解决方案3】:

        使用isin:

        time_series[time_series.index.isin(['2013-01-01 11:00:00',
                                            '2013-01-01 00:00:00',
                                            '2013-12-30 18:00:00'])].values
        
        # Returns: array([   0,   11, 8730])
        

        betweenbetween_time 也很有用

        【讨论】:

        • 此解决方案不会使重复的时间戳产生重复的索引。我有许多重复的时间戳,需要它们生成重复的索引(因此索引输出与日期时间输入的形状相同)。我更新了原始问题以反映这一点。不过谢谢你的回答!它肯定比我的解决方案更接近!
        猜你喜欢
        • 2021-12-29
        • 2019-02-19
        • 1970-01-01
        • 2017-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多