我在 Python 中有 Pandas 資料框,如下所示:
VAL
--------
99050605188
00102255789
20042388956
02111505667
值采用 str 格式。
前 6 個數字表示日期,例如:
- 99050605188 --> 1999-05-06
- 00102255789 --> 2000-10-22
- 20042388956 --> 1920-04-23
意識到:
- 如果“VAL”列中的值以 0 開頭,則為 2000 年,例如 001203... ---> 2000-12-03, 021115...--> 2002-11-15
- 如果“VAL”列中的值以 9,8,7,6,5,4,3,2,1 開頭,則為 1900 年,例如 200423... --> 1920-04-23
因此,我需要如下所示的內容(str 格式的“日期”列):
VAL date
---------------------------
99050605188 | 1999-05-06
00102255789 | 2000-10-22
20042388956 | 1920-04-23
02111505667 | 2002-11-15
我怎樣才能在 Python Pandas 中做到這一點?
uj5u.com熱心網友回復:
您可以使用np.where()檢查列的第一位數字VAL來確定世紀。然后,使用pd.to_datetime()轉換日期,如下:
import numpy as np
# 20xx if first digit 0, else 19xx. Concat 20/19 with yymmdd
date_lst = np.where(df['VAL'].str[0] == '0', '20' df['VAL'].str[:6], '19' df['VAL'].str[:6])
# convert date in YYYYmmdd
df['date'] = pd.to_datetime(date_lst, format='%Y%m%d')
結果:
print(df)
VAL date
0 99050605188 1999-05-06
1 00102255789 2000-10-22
2 20042388956 1920-04-23
3 02111505667 2002-11-15
uj5u.com熱心網友回復:
您可以使用格式決議字串的前 6 個字符,%y%m%d然后根據您的要求更改年份。
演示:
from datetime import datetime
import pandas as pd
df = pd.DataFrame(
{'val': ['99050605188', '00102255789', '20042388956', '02111505667']})
date_list = []
for s in df['val']:
date = datetime.strptime(s[:6], '%y%m%d')
if s[0] != '0' and date.year > 2000:
date = date.replace(year=date.year - 100)
date_list.append(date.date())
result = df.assign(date=pd.Series(date_list))
print(result)
輸出:
val date
0 99050605188 1999-05-06
1 00102255789 2000-10-22
2 20042388956 1920-04-23
3 02111505667 2002-11-15
根據來自 OP 的以下請求進行更新:
當 val 為 NaN 并且在這種情況下在“日期”列中回傳 1900-01-01 時,您能否也進行更新?
from datetime import datetime
import pandas as pd
import numpy as np
df = pd.DataFrame(
{'val': ['99050605188', '00102255789', '20042388956', '02111505667', np.nan]})
date_list = ['19000101' if pd.isnull(s) else ('20' s if s[0] == '0' else '19' s)[:8] for s in df['val']]
result = df.assign(date=pd.Series(pd.to_datetime(date_list, format='%Y%m%d')))
print(result)
輸出:
val date
0 99050605188 1999-05-06
1 00102255789 2000-10-22
2 20042388956 1920-04-23
3 02111505667 2002-11-15
4 NaN 1900-01-01
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/321773.html
上一篇:具有特定字串名稱的多列的字串匹配
