![](/img/trans.png)
[英]How to slice pandas' dataframe / series into hours blocks based on index?
[英]Slice Pandas series (based on index) into multiple columns of dataframe
例如,我正在嘗試將一個字段“日期”切片,將YYYYMMDD格式的日期包含在3個單獨的字段中(“年”,“月”,“日”)。
我有一種方法,一次分配一個值,但我認為有一種更有效的方法來產生所需的結果。
當前解決方案
df['year'] = df['date'].astype(str).apply(lambda x: x[:4])
df['month'] = df['date'].astype(str).apply(lambda x: x[4:6])
df['day'] = df['date'].astype(str).apply(lambda x: x[6:8])
以下是我嘗試簡化代碼的一個示例:
df['year'], df['month'], df['day'] = df['date'].astype(str).apply(lambda x: [x[:4], x[4:6], x[6:8]])
您應該始終將日期列轉換為pandas datetime對象。 您可以通過以下兩種方式之一完成此操作:1。當您提出日期時:
df = pd.read_csv('your-raw_date.csv', parse_dates=[5,7])
注意:5和7是日期所在的列號。
to_datetime
的方法用於單個列。 有關詳細信息,請參閱此帖 其次,導入一個名為datetime的模塊
import datetime as dt
一旦你有了這兩件事,你可以做以下事情:
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.day
你可以做其他很酷的事情
dt['signup_date_dayofweek'] = dt['date'].dt.dayofweek
查看datatime模塊的完整文檔
將字符串轉換為datetime並使用datetime-type列' .dt.
屬性
df.date = pd.to_datetime(df.date, format='%Y%m%d')
df['year'], df['month'], df['day'] = df.date.dt.year, df.date.dt.month, df.date.dt.day
將日期從日期轉換為日期時,您可能會發現甚至不需要提取年,月和日,因為通過date
列的dt
屬性可以輕松獲得屬性。
因為看起來它們已經是整數,所以忘記所有的字符串格式。
df['year'] = df.date//10**4
df['month'] = df.date//100%100
df['day'] = df.date%100
假設列date
是字符串( object
)dtype:
In [18]: df
Out[18]:
date
0 20180131
1 20180611
2 20180513
In [19]: df.dtypes
Out[19]:
date object
dtype: object
解:
In [22]: df[['year','month','day']] = df.date.str.extract(r'(\d{4})(\d{2})(\d{2})').astype(int)
In [23]: df
Out[23]:
date year month day
0 20180131 2018 1 31
1 20180611 2018 6 11
2 20180513 2018 5 13
In [24]: df.dtypes
Out[24]:
date object
year int32
month int32
day int32
dtype: object
PS如果date
是數字dtype,那么我選擇@ ALollz的解決方案......
這是使用operator.attrgetter
的功能解決方案:
from operator import attrgetter
df = pd.DataFrame({'Date': [20180131, 20180611, 20180513]})
df['Date'] = pd.to_datetime(df['Date'], format='%Y%m%d')
parts = ('year', 'month', 'day')
df['Year'], df['Month'], df['Day'] = zip(*df['Date'].apply(attrgetter(*parts)).values)
print(df)
Date Year Month Day
0 2018-01-31 2018 1 31
1 2018-06-11 2018 6 11
2 2018-05-13 2018 5 13
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.