1. 問題
我有一個資料框,并且Year-Month列包含我要提取的年份和月份。
例如,此列中的一個元素是"2022-10"。我想從中提取year=2022 , month=10。
我目前的解決方案是使用apply和lambda功能:
df['xx_month'] = df['Year-Month'].apply(lambda x: int(x.split('-')[1]))
但是在一個巨大的資料幀上它非常慢。
如何更有效地做到這一點?
2. 解決方案
感謝您的智慧,我用代碼總結了每個人的解決方案:
(1) 用'-'分割并加入@Vitalizzare
- pandas.Series.str.split - 拆分系列的字串,如果 expand=True 則回傳一個資料框,每個部分在單獨的列中;
- pandas.DataFrame.set_axis - 如果 axis='columns' 然后重命名資料框的列名;
- pandas.DataFrame.join - 如果索引相等,則回傳水平堆疊在一起的幀。
df = pd.DataFrame({'Year-Month':['2022-10','2022-11','2022-12']})
df = df.join(
df['Year-Month']
.str.split('-', expand=True)
.set_axis(['year','month'], axis='columns')
)
(2)將資料型別從object(str)轉換為datetime格式@ Neele22
import pandas as pd
df['Year-Month'] = pd.to_datetime(df['Year-Month'], format="%Y-%m")
(3) 使用正則運算式或日期時間提取年月@mozway
df['Year-Month'].str.extract(r'(?P<year>\d )-(?P<month>\d )').astype(int)
# If you want to assign the output to the same DataFrame while removing the original Year-Month:
df[['year', 'month']] = df.pop('Year-Month').str.extract(r'(\d )-(\d )').astype(int)
或使用日期時間:
date = pd.to_datetime(df['Year-Month'])
df['year'] = date.dt.year
df['month'] = date.dt.month
3.跟進問題
但是,如果我想在將不完整的“年月”列從字串轉換為日期時間之后,用其他日期時間列減去“年月”,就會出現問題。
例如,如果我想獲取每條記錄的時間戳后不遲于 2 個月的資料。
import dateutil # dateutil is a better package than datetime package according to my experience
df[(df['timestamp'] - df['Year-Month'])>= dateutil.relativedelta.relativedelta(months=0) and (df['timestamp'] - df['Year-Month'])<= datetime.timedelta(months=2)]
此代碼將Year-Month使用實際日期時間列減去轉換后的列的型別錯誤。
TypeError:不能減去 tz-naive 和 tz-aware datetime-like objects
這兩列的型別是:
Year-Month是 datetime64[ns]timestamp是 datetime64[ns, UTC]
然后,我嘗試指定utc=True何時更改Year-Month為 datetime 型別:
df[["Year-Month"]] = pd.to_datetime(df[["Year-Month"]],utc=True,format="%Y-%m")
但我得到了價值錯誤。
ValueError:組裝映射至少需要指定 [year,month,day]:[day,month,year] 缺失
4.帶走
如果列中的元素的 [day,month,year] 不完整。(就像在我的情況下,我只有年和月),我們不能將此列從字串型別更改為日期時間型別來進行計算。但是要使用提取的日期和月份來進行計算。
如果您不需要在不完整的日期時間列和其他日期時間列之間進行計算,您可以將不完整的日期時間字串更改為日期時間型別,并從中提取 [day,month,year]。它比使用 regex、split 和 join 更容易。
uj5u.com熱心網友回復:
df = pd.DataFrame({'Year-Month':['2022-10','2022-11','2022-12']})
df = df.join(
df['Year-Month']
.str.split('-', expand=True)
.set_axis(['year','month'], axis='columns')
)
- pandas.Series.str.split - 拆分系列的字串,如果
expand=True然后回傳一個資料框,每個部分在一個單獨的列中; - pandas.DataFrame.set_axis - 如果
axis='columns'然后重命名資料框的列名; - pandas.DataFrame.join - 如果索引相等,則回傳水平堆疊在一起的幀。
uj5u.com熱心網友回復:
您可以為此使用正則運算式。
創建一個新的資料框:
df['Year-Month'].str.extract(r'(?P<year>\d )-(?P<month>\d )').astype(int)
如果要在洗掉原始年月的同時將輸出分配給相同的 DataFrame:
df[['year', 'month']] = df.pop('Year-Month').str.extract(r'(\d )-(\d )').astype(int)
示例輸入:
Year-Month
0 2022-10
輸出:
year month
0 2022 10
使用日期時間的替代方法:
您還可以使用日期時間中間體
date = pd.to_datetime(df['Year-Month'])
df['year'] = date.dt.year
df['month'] = date.dt.month
輸出:
Year-Month year month
0 2022-10 2022 10
uj5u.com熱心網友回復:
您還可以將資料型別從物件 (str) 轉換為日期時間格式。這將使處理日期更容易。
import pandas as pd
df['Year-Month'] = pd.to_datetime(df['Year-Month'], format="%Y-%m")
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/512599.html
標籤:Python熊猫约会时间
