web-dev-qa-db-ja.com

Python(pandas)?

日付文字列でそれを行う方法について多くの投稿を見てきましたが、私はデータフレーム列に何かを試みており、今のところ運がありません。私の現在の方法は、「myday」から平日を取得してから、月曜日を取得するためにオフセットします。

df['myday'] is column of dates. 
mydays = pd.DatetimeIndex(df['myday']).weekday
df['week_start'] = pd.DatetimeIndex(df['myday']) - pd.DateOffset(days=mydays)

しかし、TypeError:timedelta daysコンポーネントでサポートされていないタイプnumpy.ndarrayを取得します

Df列から週の開始日を取得するにはどうすればよいですか?

20
dev28

これは、pd.DateOffsetがパラメーターとして単一の整数を期待しているために失敗します(そして、配列にフィードします)。同じオフセットで日付列を変更するには、DateOffsetのみを使用できます。

これを試して :

import datetime as dt
# Change 'myday' to contains dates as datetime objects
df['myday'] = pd.to_datetime(df['myday'])  
# 'daysoffset' will container the weekday, as integers
df['daysoffset'] = df['myday'].apply(lambda x: x.weekday())
# We apply, row by row (axis=1) a timedelta operation
df['week_start'] = df.apply(lambda x: x['myday'] - dt.TimeDelta(days=x['daysoffset']), axis=1)

私は実際にはこのコードをテストしていません(サンプルデータはありませんでした)が、あなたが説明したとおりに機能するはずです。

ただし、 pandas.Resample を確認することをお勧めします。これは、探しているものに応じて、より優れたソリューションを提供する可能性があります。

2
knightofni

別の選択肢:

df['week_start'] = df['myday'].dt.to_period('W').apply(lambda r: r.start_time)

これにより、「week_start」が「myday」の時刻の前の最初の月曜日に設定されます。

23
Paul

@ knightofni's@ Paul's の両方のソリューションは機能しますが、apply Pandasは通常非常に遅いため、applyを使用しないでください。配列ベースのメソッドと比較して、これを回避するには、平日ベースのメソッドを変更して、曜日を numpy timedelta64 [D] にキャストするだけです。

df['week_start'] = df['myday'] - df['myday'].dt.weekday.astype('timedelta64[D]')

60,000の日時のテストデータを使用して、他の2つの提案された回答とキャスティングベースの方法を使用して、次の時間を取得しました。

%timeit df.apply(lambda x: x['myday'] - datetime.timedelta(days=x['myday'].weekday()), axis=1)
>>> 1 loop, best of 3: 7.43 s per loop
%timeit df['myday'].dt.to_period('W').apply(lambda r: r.start_time)
>>> 1 loop, best of 3: 2.38 s per loop
%timeit df['myday'] - df['myday'].dt.weekday.astype('timedelta64[D]')
>>> 100 loops, best of 3: 12.3 ms per loop

または私のデータセットでほぼ200倍高速。

16
n8yoder

n8yoder の答えに追加するだけです)

.astype('timedelta64[D]')を使用するのは私にはそれほど読みにくいようです-パンダの機能だけを使用する代替案を見つけました:

df['myday'] - pd.to_timedelta(arg=df['myday'].dt.weekday, unit='D')
3
ribitskiyb
from datetime import datetime, timedelta

# Convert column to pandas datetime equivalent
df['myday'] = pd.to_datetime(df['myday']) 

# Create function to calculate Start Week date
week_start_date = lambda date: date - timedelta(days=date.weekday())

# Apply above function on DataFrame column
df['week_start_date'] = df['myday'].apply(week_start_date)
0
Rohan R. Pawar