2016-04-21 7 views
0

При попытке суммировать по timedeltas в пандах, похоже, работает на кусочек, но не на весь столбец.Сумма переполнения TimeDeltas в Python Pandas

>> d.ix[0:100, 'VOID-DAYS'].sum() 
Timedelta('2113 days 00:00:00') 

>> d['VOID-DAYS'].sum() 


ValueError: overflow in timedelta operation 
+1

Это означает, что ваши значения сумм превышают максимальные пределы timedelta: https://docs.python.org/3/library/datetime.html#timedelta-объекты, сколько у вас строк? – EdChum

ответ

4

Если VOID-DAYS представляет собой целое число дней, преобразовать Timedeltas в целые числа:

df['VOID-DAYS'] = df['VOID-DAYS'].dt.days 

import numpy as np 
import pandas as pd 
df = pd.DataFrame({'VOID-DAYS': pd.to_timedelta(np.ones((106752,)), unit='D')}) 
try: 
    print(df['VOID-DAYS'].sum()) 
except ValueError as err: 
    print(err) 
    # overflow in timedelta operation 


df['VOID-DAYS'] = df['VOID-DAYS'].dt.days 
print(df['VOID-DAYS'].sum()) 
# 106752 

Если Timedeltas включают секунд или меньше единицы, а затем использовать

df['VOID-DAYS'] = df['VOID-DAYS'].dt.total_seconds() 

для преобразования значения в поплавок.


Панды Timedeltas (серия и TimedeltaIndexes) хранить все timedeltas как Интс, совместимых с timedelta64[ns] DTYPE Numpy в. Этот dtype использует 8-байтовые ints для хранения timedelta в наносекундах.

Наибольшее количество дней, изображаемых в этом формате

In [73]: int(float(np.iinfo(np.int64).max)/(10**9 * 3600 * 24)) 
Out[73]: 106751 

Именно поэтому

In [74]: pd.Series(pd.to_timedelta(np.ones((106752,)), unit='D')).sum() 
ValueError: overflow in timedelta operation 

поднимает ValueError, но

In [75]: pd.Series(pd.to_timedelta(np.ones((106751,)), unit='D')).sum() 
Out[75]: Timedelta('106751 days 00:00:00') 

не.