我尝试获得各种大熊猫日期的日期增量。然而,对于时间增量> 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?
答案 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
看到最小值和最大值都是正值。
如果你的间隙太大,这种解决方法就没有用了。像这里:
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)
方法来解决此问题。