質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

14037閲覧

python; np.meanにて Python int too large to convert to C long と出る

kamataha

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/21 03:51

リスト内のTimedeltaをnp.meanで平均しようとしたのですが、Python int too large to convert to C longと出てしまいます。

リスト内の時間がCのlongの範囲を超えてしまったということなのでしょうが、これをどうにか計算できるようにすることは可能なのでしょうか。

listを間引きすれば計算できる様にはなるのですが、間引きせずに計算できる方法があれば教えていただきたいです。
よろしくお願いします。

リスト(kakuteiList_np)
[[0 Timedelta('18 days 00:24:58')]
[1 Timedelta('17 days 23:59:23')]
[2 Timedelta('0 days 03:23:49')]
...
[17202 Timedelta('0 days 19:49:57')]
[17203 Timedelta('0 days 19:02:17')]
[17204 Timedelta('0 days 18:19:02')]]

問題箇所=================
kakuteiTimeAve=np.mean(kakuteiList_np,axis=0)

エラ〜メッセージ========================
File "/該当プログラム.py", line 106, in <module>
kakuteiTimeAve=np.mean(kakuteiList_np,axis=0)

File "<array_function internals>", line 6, in mean

File "/opt/anaconda3/lib/python3.7/site-packages/numpy/core/fromnumeric.py", line 3335, in mean
out=out, **kwargs)

File "/opt/anaconda3/lib/python3.7/site-packages/numpy/core/_methods.py", line 151, in _mean
ret = umr_sum(arr, axis, dtype, out, keepdims)

File "pandas/_libs/tslibs/timedeltas.pyx", line 605, in pandas._libs.tslibs.timedeltas._binary_op_method_timedeltalike.f

File "pandas/_libs/tslibs/timedeltas.pyx", line 1230, in pandas._libs.tslibs.timedeltas.Timedelta.new

File "pandas/_libs/tslibs/timedeltas.pyx", line 180, in pandas._libs.tslibs.timedeltas.convert_to_timedelta64

File "pandas/_libs/tslibs/timedeltas.pyx", line 308, in pandas._libs.tslibs.timedeltas.cast_from_unit

OverflowError: Python int too large to convert to C long

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

pandasのTimedeltaの精度はナノ秒であるため、10日間のTimedelta値は、10^9*3600*24*10 = 86,400,000,000,000となります。これを、long intの最大値9,223,372,036,854,775,807から割り算すると、答えは約10,675となります、すなわち10日間のTimedeltaを10000回程度加算すると、long intをオーバーフローすることになります。これが、今回発生した事象です。

簡単には、精度がマイクロ秒であるdatetime.timedelta型に変換してから計算すると、キャパシティが1000倍になりますので、解決できます。質問文のコードからは秒単位の精度で十分であると思いますので、秒単位のintに直してから計算したほうが、恒久対策になるでしょう。

Timedeltaを使った配列、精度、datetime.timedeltaへの変換方法、精度、平均値計算結果を、以下のコードで示します。

Python

1import numpy as np 2import pandas as pd 3import datetime as datetime 4 5kakuteiList_np = np.array([ 6 [0, pd.Timedelta('18 days 00:24:58')], 7 [1, pd.Timedelta('17 days 23:59:23')], 8 [2, pd.Timedelta('0 days 03:23:49')] 9 ]) 10 11for i in range(3, 17202): 12 kakuteiList_np = np.vstack((kakuteiList_np, np.array([ 13 [i, pd.Timedelta('17 days 23:59:23')] 14 ]))) 15 16kakuteiList_np = np.vstack((kakuteiList_np, 17 np.array([ 18 [17202, pd.Timedelta('0 days 19:49:57')], 19 [17203, pd.Timedelta('0 days 19:02:17')], 20 [17204, pd.Timedelta('0 days 18:19:02')], 21 ]))) 22 23print('変換前 kakuteiList_npの表示') 24print(kakuteiList_np) 25print('精度:', kakuteiList_np[0, 1].resolution) 26print() 27 28kakuteiList_np[:,1] = kakuteiList_np[:,1].astype('timedelta64') 29print('変換後 kakuteiList_npの表示') 30print(kakuteiList_np) 31print('精度:', kakuteiList_np[0, 1].resolution) 32print() 33 34kakuteiTimeAve = np.mean(kakuteiList_np, axis=0) 35print('kakuteiTimeAveの表示') 36print(kakuteiTimeAve)

以下が上記コードを実行した時の出力です。

変換前 kakuteiList_npの表示 [[0 Timedelta('18 days 00:24:58')] [1 Timedelta('17 days 23:59:23')] [2 Timedelta('0 days 03:23:49')] ... [17202 Timedelta('0 days 19:49:57')] [17203 Timedelta('0 days 19:02:17')] [17204 Timedelta('0 days 18:19:02')]] 精度: 0 days 00:00:00.000000001 変換後 kakuteiList_npの表示 [[0 datetime.timedelta(days=18, seconds=1498)] [1 datetime.timedelta(days=17, seconds=86363)] [2 datetime.timedelta(seconds=12229)] ... [17202 datetime.timedelta(seconds=71397)] [17203 datetime.timedelta(seconds=68537)] [17204 datetime.timedelta(seconds=65942)]] 精度: 0:00:00.000001 kakuteiTimeAveの表示 [8602.0 datetime.timedelta(days=17, seconds=86014, microseconds=205347)]

投稿2020/09/21 09:27

toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

以下のように再現を試みましたが、特に問題無く計算できてしまいます。
再現条件を確認いただけますでしょうか?

再現コード

Python

1import numpy as np 2from datetime import timedelta 3 4def Str2Timedelta(str): 5 days, _, hhmmss = str.split(' ') 6 days = int(days) 7 hours, minutes, seconds = map(int, hhmmss.split(":")) 8 td = timedelta(days=days, hours=hours, minutes=minutes, seconds=seconds) 9 return td 10 11kakuteiList_np = np.array([ 12 [0, Str2Timedelta('18 days 00:24:58')], 13 [1, Str2Timedelta('17 days 23:59:23')], 14 [2, Str2Timedelta('0 days 03:23:49')] 15 ]) 16 17for i in range(3, 17202): 18 kakuteiList_np = np.vstack((kakuteiList_np, np.array([ 19 [i, Str2Timedelta('17 days 23:59:23')] 20 ]))) 21 22kakuteiList_np = np.vstack((kakuteiList_np, 23 np.array([ 24 [17202, Str2Timedelta('0 days 19:49:57')], 25 [17203, Str2Timedelta('0 days 19:02:17')], 26 [17204, Str2Timedelta('0 days 18:19:02')], 27 ]))) 28 29 30print('kakuteiList_npの表示') 31print(kakuteiList_np) 32 33kakuteiTimeAve = np.mean(kakuteiList_np, axis=0) 34 35print() 36print('kakuteiTimeAveの表示') 37print(kakuteiTimeAve)

実行結果

kakuteiList_npの表示 [[0 datetime.timedelta(days=18, seconds=1498)] [1 datetime.timedelta(days=17, seconds=86363)] [2 datetime.timedelta(seconds=12229)] ... [17202 datetime.timedelta(seconds=71397)] [17203 datetime.timedelta(seconds=68537)] [17204 datetime.timedelta(seconds=65942)]] kakuteiTimeAveの表示 [8602.0 datetime.timedelta(days=17, seconds=86014, microseconds=205347)]

投稿2020/09/21 05:10

toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daregada

2020/09/21 07:30

エラーメッセージから見て、おそらく質問者はdatetime.timedeltaではなく、pd .Timedeltaを使っている。
toast-uz

2020/09/21 08:16

ありがとうございます。pd.Timedaltaを使うことでエラーが再現しまた。
toast-uz

2020/09/21 08:35

そうですね。nanosecond resolutionだから、巨大数値になっているものと思います。resolutionを落とすことができれば解決です。
kamataha

2020/09/21 10:51

お二方ありがとうございます!解決しました。
guest

0

longの範囲外かどうかを判定して、多桁の計算を行うようにしましょう。
まずは、多桁の計算ライブラリを構築する必要がありますね

投稿2020/09/21 04:30

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問