[英]Python get previous day of week (Thursday in my example) from pandas date column
[英]Pandas Get Day of Week from date type column
我使用的是Python 3.6和Pandas 0.20.3。
我有一個列,我已從datetime轉換為日期類型。 我只需要約會。 為了便於使用,我將它作為派生列。 但我希望通過一周中的一天計算進行一些進一步的操作。 我可以從日期時間類型獲取星期幾,但不能從日期開始。 在我看來,這應該是可能的,但我嘗試了多種變化而沒有找到成功。
這是一個例子:
import numpy as np
import pandas as pd
df = pd.DataFrame({'date':['2017-5-16','2017-5-17']})
df['trade_date']=pd.to_datetime(df['date'])
我可以從datetime列'trade_date'獲取星期幾。
df['dow']=df['trade_date'].dt.dayofweek
df
date trade_date dow
0 2017-5-16 2017-05-16 1
1 2017-5-17 2017-05-17 2
但是,如果我有一個約會,而不是一個約會時間,沒有骰子:例如:
df['trade_date_2']=pd.to_datetime(df['date']).dt.date
然后:
df['dow_2']=df['trade_date_2'].dt.dayofweek
我得到(最后):
AttributeError: Can only use .dt accessor with datetimelike values
我已經嘗試了dayofweek(),工作日,工作日()的各種組合,我意識到這些組合突出了我對Pandas究竟是如何工作的無知。 那么...除了添加另一列的任何建議,這是列trade_date的日期時間版本? 我也歡迎解釋為什么這不起作用。
有問題是pandas datetime
(timestamps)之間的區別是實現.dt
方法和python date
沒有。
#return python date
df['trade_date_2']= pd.to_datetime(df['date']).dt.date
print (df['trade_date_2'].apply(type))
0 <class 'datetime.date'>
1 <class 'datetime.date'>
Name: trade_date_2, dtype: object
#cannot work with python date
df['dow_2']=df['trade_date_2'].dt.dayofweek
需要轉換為pandas datetime
:
df['dow_2']= pd.to_datetime(df['trade_date_2']).dt.dayofweek
print (df)
date trade_date_2 dow_2
0 2017-5-16 2017-05-16 1
1 2017-5-17 2017-05-17 2
所以最好用的是:
df['date'] = pd.to_datetime(df['date'])
print (df['date'].apply(type))
0 <class 'pandas._libs.tslib.Timestamp'>
1 <class 'pandas._libs.tslib.Timestamp'>
Name: date, dtype: object
df['trade_date_2']= df['date'].dt.date
df['dow_2']=df['date'].dt.dayofweek
print (df)
date trade_date_2 dow_2
0 2017-05-16 2017-05-16 1
1 2017-05-17 2017-05-17 2
編輯:
感謝Bharath shetty解決使用python date
- 使用NaT
失敗:
df = pd.DataFrame({'date':['2017-5-16',np.nan]})
df['trade_date_2']= pd.to_datetime(df['date']).dt.date
df['dow_2'] = df['trade_date_2'].apply(lambda x: x.weekday())
AttributeError:'float'對象沒有屬性'weekday'
比較解決方案:
df = pd.DataFrame({'date':['2017-5-16','2017-5-17']})
df = pd.concat([df]*10000).reset_index(drop=True)
def a(df):
df['trade_date_2']= pd.to_datetime(df['date']).dt.date
df['dow_2'] = df['trade_date_2'].apply(lambda x: x.weekday())
return df
def b(df):
df['date1'] = pd.to_datetime(df['date'])
df['trade_date_21']= df['date1'].dt.date
df['dow_21']=df['date1'].dt.dayofweek
return (df)
def c(df):
#dont write to column, but to helper series
dates = pd.to_datetime(df['date'])
df['trade_date_22']= dates.dt.date
df['dow_22']= dates.dt.dayofweek
return (df)
In [186]: %timeit (a(df))
10 loops, best of 3: 101 ms per loop
In [187]: %timeit (b(df))
10 loops, best of 3: 90.8 ms per loop
In [188]: %timeit (c(df))
10 loops, best of 3: 91.9 ms per loop
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.