【问题标题】:Day delta for dates >292 years apart日期相差 >292 年的日差
【发布时间】:2016-06-19 06:11:25
【问题描述】:

我尝试获取各种熊猫日期的日期增量。但是,对于 >292 年的时间增量,我得到负值。例如,

import pandas as pd
dates = pd.Series(pd.date_range('1700-01-01', periods=4500, freq='m'))
days_delta = (dates-dates.min()).astype('timedelta64[D]')

但是,使用 DatetimeIndex 我可以做到,并且可以按我的意愿工作,

import pandas as pd
import numpy as np
dates = pd.date_range('1700-01-01', periods=4500, freq='m')
days_fun = np.vectorize(lambda x: x.days)
days_delta = days_fun(dates.date - dates.date.min())

那么问题是如何为Series对象获取正确的days_delta?

【问题讨论】:

  • 我之前以pandas issue 的形式提交了它,并且已经找到了解决方法。但我想它至少应该在未来发出警告......
  • 文档中有一节关于处理out-of-bound spans。你检查了吗?

标签: python datetime numpy pandas


【解决方案1】:

阅读here 专门了解时间增量限制:

Pandas 使用 64 位整数表示纳秒分辨率的时间增量。因此,64 位整数限制决定了 Timedelta 限制。

顺便说一句,这与文档提到的 Pandas 时间戳中的限制相同:

由于 pandas 以纳秒分辨率表示时间戳,因此可以使用 64 位整数表示的时间跨度被限制为大约 584 年

这表明文档为规避时间戳限制所提出的相同建议可以应用于时间增量。时间戳限制的解决方案可在文档 (here) 中找到:

如果您有超出时间戳范围的数据,请参阅时间戳限制,那么您可以使用 PeriodIndex 和/或 Series of Periods 进行计算。

【讨论】:

    【解决方案2】:

    解决方法

    如果您有可计算的小间隔的连续日期,如您的示例所示,您可以对系列进行排序,然后使用cumsum 来解决此问题,如下所示:

    import pandas as pd
    dates = pd.TimeSeries(pd.date_range('1700-01-01', periods=4500, freq='m'))
    dates.sort()
    dateshift = dates.shift(1)
    (dates - dateshift).fillna(0).dt.days.cumsum().describe()
    
    count      4500.000000
    mean      68466.072444
    std       39543.094524
    min           0.000000
    25%       34233.250000
    50%       68465.500000
    75%      102699.500000
    max      136935.000000
    dtype: float64
    

    看到最小值和最大值都是正数。

    故障解决

    如果您的差距太大,则此解决方法无效。喜欢这里:

    dates = pd.Series(pd.datetools.to_datetime(['2016-06-06', '1700-01-01','2200-01-01']))
    dates.sort()
    dateshift = dates.shift(1)
    (dates - dateshift).fillna(0).dt.days.cumsum()
    
    1        0
    0   -97931
    2   -30883
    

    这是因为我们计算了每个日期之间的步长,然后将它们相加。并且当它们被排序时,我们可以保证最小的步数,但是,在这种情况下,每个步都太大而无法处理。

    重置订单

    正如您在 Failaround 示例中看到的,该系列不再按索引排序。通过调用系列上的.reset_index(inplace=True) 方法来解决此问题。

    【讨论】:

      猜你喜欢
      • 2021-05-06
      • 2018-04-24
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 2014-01-21
      相关资源
      最近更新 更多