日期的日期三角洲>相隔292年

时间:2016-03-05 12:34:08

标签: python datetime numpy pandas

我尝试获得各种大熊猫日期的日期增量。然而,对于时间增量> 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?

2 个答案:

答案 0 :(得分:0)

特别关于timedelta限制阅读here

  

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

顺便提一下,这与大熊猫时间戳中提到的文档相同:

  

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

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

  

如果您的数据超出时间戳范围,请参阅时间戳限制,然后您可以使用PeriodIndex和/或系列句点进行计算。

答案 1 :(得分:0)

解决方法

如果你有可以计算的小间隙的连续日期,就像在你的例子中一样,你可以对系列进行排序,然后使用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

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

Failaround

如果你的间隙太大,这种解决方法就没有用了。像这里:

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)方法来解决此问题。