3

dta_hは DataFrame であり、dta_h.Datetimeは次のようになります。

0    2013-03-01 00:00:00
1    2013-02-28 23:00:00
2    2013-02-28 22:00:00
3    2013-02-28 21:00:00
...
Name: Datetime, Length: 63001, dtype: datetime64[ns]

最近まで (これが何を意味するかは後で説明します)、次のようにして、各期間の 1 時間を減算することができました。

dta_h.Datetime-np.timedelta(hours=1)

しかし、今、上記を実行すると、次のようになります。

0    2013-03-01 00:11:34.967296
1    2013-02-28 23:11:34.967296
2    2013-02-28 22:11:34.967296
3    2013-02-28 21:11:34.967296
...

これは明らかに私が望むものではありません。ただし、これは次のとおりです。

[i-timedelta(hours=1) for i in dta_h.Datetime ]

それでも望ましい結果が得られます:

0    2013-02-28 23:00:00
1    2013-02-28 22:00:00
2    2013-02-28 21:00:00
3    2013-02-28 20:00:00
....
Length: 63001, dtype: datetime64[ns]

Pandas 0.11 にアップグレードしたときにこの問題が発生したことは 99% 確信しています。私は、成功しないことを説明する可能性のあるバージョンの違いについて、ドキュメントを調べてきました。この投稿も見つけました:

numpy timedelta64 [ms]のパンダ処理

これはこのパンダの問題を指します

https://github.com/pydata/pandas/issues/3009

そこで読んだことに基づいて、試しました:

dta_h.Datetime-np.timedelta64(hours=1)

しかし、これは実際には何もしません:

0    2013-03-01 00:00:00
1    2013-02-28 23:00:00
2    2013-02-28 22:00:00
3    2013-02-28 21:00:00
...

1) df-np.timedelta が機能しなくなった理由、および 2) 理解リストのバージョンがまだ機能している理由は何ですか? 助けてくれてありがとう。

参考までに、私は Numpy 1.6.2 を使用しており、先に述べたように、最近 Pandas 0.9 から 0.11 にアップグレードしました

4

2 に答える 2

2

Numpy は、1.6.2/1 の timedeltas でかなりバグがあります。30分未満の間隔で機能します(理由はわかりません)。最善の策は、より安定した numpy 1.7.0/1 にアップグレードし、datetime.timedelta を使用することです。

In [33]: df = DataFrame(dict(date = [Timestamp('20130301'),Timestamp('20130228 23:00:00'),Timestamp('20130228 22:00:00'),Timestamp('20130228 21:00:00')]))

In [34]: df
Out[34]: 
                 date
0 2013-03-01 00:00:00
1 2013-02-28 23:00:00
2 2013-02-28 22:00:00
3 2013-02-28 21:00:00

In [37]: df['date'] + timedelta(hours=1)
Out[37]: 
0   2013-03-01 01:00:00
1   2013-03-01 00:00:00
2   2013-02-28 23:00:00
3   2013-02-28 22:00:00
Name: date, dtype: datetime64[ns]

In [38]: np.__version__
Out[38]: '1.7.1'
于 2013-07-05T15:46:37.117 に答える
1

ナノ秒単位の時間を使用できます。

In [11]: df - pd.np.timedelta64(60*60*10**9)  # one hour in nanoseconds
Out[11]:
                     date
index
0     2013-02-28 23:00:00
1     2013-02-28 22:00:00
2     2013-02-28 21:00:00
3     2013-02-28 20:00:00

キーワード引数は、timedelta64 によって無視されるようです。

In [12]: df - pd.np.timedelta64(foo=60*60*10**9)
Out[12]:
                     date
index
0     2013-03-01 00:00:00
1     2013-02-28 23:00:00
2     2013-02-28 22:00:00
3     2013-02-28 21:00:00

pandas オフセットを使用できるようにする必要があるように感じます。

df.date - pd.offsets.Hour(1)
ValueError: cannot operate on a series with out a rhs of a series/ndarray of type datetime64[ns] or a timedelta

現時点では、apply または delta 属性を使用してこれを行うことができます。

In [21]: df.date.apply(lambda t: t - pd.offsets.Hour(1))
Out[21]:
index
0       2013-02-28 23:00:00
1       2013-02-28 22:00:00
2       2013-02-28 21:00:00
3       2013-02-28 20:00:00
Name: date, dtype: datetime64[ns]

In [22]: df.date - pd.offsets.Hour(1).delta
Out[22]:
index
0       2013-02-28 23:00:00
1       2013-02-28 22:00:00
2       2013-02-28 21:00:00
3       2013-02-28 20:00:00
Name: date, dtype: datetime64[ns]
于 2013-07-05T15:23:53.407 に答える