pandas21 讀csv檔案read_csv(11.日期時間)(詳細 tcy)
阿新 • • 發佈:2018-12-29
日期時間處理 201/12/26
# parse_dates,date_parser 指定列的日期/時間格式,將文字資料轉換為datetime
目錄: 第1部分:csv文字檔案讀寫 pandas 讀csv檔案read_csv(1.文字讀寫概要)https://mp.csdn.net/postedit/85289371 pandas 讀csv檔案read_csv(2.read_csv引數介紹)https://mp.csdn.net/postedit/85289928 pandas 讀csv檔案read_csv(3.dtypes指定列資料型別)https://mp.csdn.net/postedit/85290575 pandas 讀csv檔案read_csv(4.to_csv文字資料寫)https://mp.csdn.net/postedit/85290962 pandas 讀csv檔案read_csv(5.文字資料讀寫例項)https://mp.csdn.net/postedit/85291123 pandas 讀csv檔案read_csv(6.命名和使用列)https://mp.csdn.net/postedit/85291430 pandas 讀csv檔案read_csv(7.索引)https://mp.csdn.net/postedit/85291658 pandas 讀csv檔案read_csv(8.方言和分隔符)https://mp.csdn.net/postedit/85291994 pandas 讀csv檔案read_csv(9.浮點轉換和NA值)https://mp.csdn.net/postedit/85292391 pandas 讀csv檔案read_csv(10.註釋和空行)https://mp.csdn.net/postedit/85292609 pandas 讀csv檔案read_csv(11.日期時間處理) https://mp.csdn.net/postedit/85292925 pandas 讀csv檔案read_csv(12.迭代和塊)https://mp.csdn.net/postedit/85293639 pandas 讀csv檔案read_csv(13.read_fwf讀固定寬度資料)https://mp.csdn.net/postedit/85294010 第2部分: pandas hdf檔案讀寫簡要https://mp.csdn.net/postedit/85294299 pandas excel讀寫簡要https://mp.csdn.net/postedit/85294545 第3部分: python中csv模組用法tcy https://mp.csdn.net/postedit/85228189 pandas讀csv檔案read_csv錯誤解決辦法7種https://mp.csdn.net/postedit/85228808 pandas to_string用法https://mp.csdn.net/postedit/85294935
例項1:parse_dates=True解析所有列:
# 例項1.1:parse_dates=True解析所有列 # Use a column as an index, and parse it as dates. from io import StringIO data='date A B C\n' \ '2018-12-21 a 1 2\n' \ '2018-12-22 b 3 4\n' \ '2018-12-23 c 4 5' df = pd.read_csv(StringIO(data),sep=r'\s+', index_col=0, parse_dates=True,engine='python') # 例項1.2:parse_dates=[1,2,3]將2,3,4列分別作為日期解析 pd.read_csv(StringIO(data), header=None, parse_dates=[1, 2,3],infer_datetime_format=True) 0 1 2 3 4 0 tcy 2019-01-27 19:00:00 18:56:00 0.81#2列解析為日期,3,4列不能解析 1 tcy 2019-01-27 20:00:00 19:56:00 0.01 2 tcy 2019-01-27 21:00:00 20:56:00 -0.59 3 tcy 2019-01-27 21:00:00 21:18:00 -0.99 4 tcy 2019-01-27 22:00:00 21:56:00 -0.59 5 tcy 2019-01-27 23:00:00 22:56:00 -0.59 # 例項1.3:parse_dates=[[1, 2], [1, 3]]多列組合在一起成為日期 # 結果日期列將新增到輸出前,新列名稱將是元件列名稱的串聯 data='tcy,20190127, 19:00:00, 18:56:00, 0.81\n' \ 'tcy,20190127, 20:00:00, 19:56:00, 0.01\n' \ 'tcy,20190127, 21:00:00, 20:56:00, -0.59\n' \ 'tcy,20190127, 21:00:00, 21:18:00, -0.99\n' \ 'tcy,20190127, 22:00:00, 21:56:00, -0.59\n' \ 'tcy,20190127, 23:00:00, 22:56:00, -0.59' df = pd.read_csv(StringIO(data), header=None, parse_dates=[[1, 2], [1, 3]]) 1_2 1_3 0 4 0 2019-01-27 19:00:00 2019-01-27 18:56:00 tcy 0.81 1 2019-01-27 20:00:00 2019-01-27 19:56:00 tcy 0.01 2 2019-01-27 21:00:00 2019-01-27 20:56:00 tcy -0.59 3 2019-01-27 21:00:00 2019-01-27 21:18:00 tcy -0.99 4 2019-01-27 22:00:00 2019-01-27 21:56:00 tcy -0.59 5 2019-01-27 23:00:00 2019-01-27 22:56:00 tcy -0.59 # 例項1.4:使用dict指定自定義名稱列,組合時間: # 傳遞dict作為parse_dates引數時,不保證前置列的順序,因為dict物件不對其鍵強加排序。 # 可用collections.OrderedDict而不是常規字典。 date_spec = {'nominal': [1, 2], 'actual': [1, 3]} df = pd.read_csv(StringIO(data), header=None, parse_dates=date_spec) nominal actual 0 4 0 2019-01-27 19:00:00 2019-01-27 18:56:00 tcy 0.81 1 2019-01-27 20:00:00 2019-01-27 19:56:00 tcy 0.01 2 2019-01-27 21:00:00 2019-01-27 20:56:00 tcy -0.59 3 2019-01-27 21:00:00 2019-01-27 21:18:00 tcy -0.99 4 2019-01-27 22:00:00 2019-01-27 21:56:00 tcy -0.59 5 2019-01-27 23:00:00 2019-01-27 22:56:00 tcy -0.59
例項2:
# 例項2.1:keep_date_col=True # 預設解析器刪除元件日期列,可選擇keep_date_col保留它們: df = pd.read_csv(StringIO(data), header=None, parse_dates=[[1, 2], [1, 3]], keep_date_col=True) 1_2 1_3 0 1 2 3 4 0 2019-01-27 19:00:00 2019-01-27 18:56:00 tcy 20190127 19:00:00 18:56:00 0.81 1 2019-01-27 20:00:00 2019-01-27 19:56:00 tcy 20190127 20:00:00 19:56:00 0.01 2 2019-01-27 21:00:00 2019-01-27 20:56:00 tcy 20190127 21:00:00 20:56:00 -0.59 3 2019-01-27 21:00:00 2019-01-27 21:18:00 tcy 20190127 21:00:00 21:18:00 -0.99 4 2019-01-27 22:00:00 2019-01-27 21:56:00 tcy 20190127 22:00:00 21:56:00 -0.59 5 2019-01-27 23:00:00 2019-01-27 22:56:00 tcy 20190127 23:00:00 22:56:00 -0.59 #例項2.2:index_col 基於新位置:用作行索引的列編號或列名 # 將'parse_dates'的dict與index_col引數一起使用時,最好將index_col指定為列標籤,而不是作為結果幀的索引。 date_spec = {'nominal': [1, 2], 'actual': [1, 3]} df = pd.read_csv(StringIO(data), header=None, parse_dates=date_spec,index_col=0) # nominal 列日期作為行索引 actual 0 4 nominal 2019-01-27 19:00:00 2019-01-27 18:56:00 tcy 0.81 2019-01-27 20:00:00 2019-01-27 19:56:00 tcy 0.01 2019-01-27 21:00:00 2019-01-27 20:56:00 tcy -0.59 2019-01-27 21:00:00 2019-01-27 21:18:00 tcy -0.99 2019-01-27 22:00:00 2019-01-27 21:56:00 tcy -0.59 2019-01-27 23:00:00 2019-01-27 22:56:00 tcy -0.59
例項3:date_parser日期解析函式
#3.1 單列轉換
dateparse = lambda x: pd.datetime.strptime(x, ' %H:%M:%S')
date_spec = { 'time1': [2], 'time2': [3]}
df = pd.read_csv(StringIO(data), parse_dates=date_spec, date_parser=dateparse,header=None)
time1 time2 0 1 4
0 1900-01-01 19:00:00 1900-01-01 18:56:00 tcy 20190127 0.81
1 1900-01-01 20:00:00 1900-01-01 19:56:00 tcy 20190127 0.01
2 1900-01-01 21:00:00 1900-01-01 20:56:00 tcy 20190127 -0.59
3 1900-01-01 21:00:00 1900-01-01 21:18:00 tcy 20190127 -0.99
4 1900-01-01 22:00:00 1900-01-01 21:56:00 tcy 20190127 -0.59
5 1900-01-01 23:00:00 1900-01-01 22:56:00 tcy 20190127 -0.59
# 3.2 多列轉換
#方法1:
import pandas.io.date_converters as conv
date_spec = {'date1': [1, 2], 'date2': [1, 3]}
df = pd.read_csv(StringIO(data), header=None, parse_dates=date_spec,
index_col='date1',date_parser=conv.parse_date_time)
#方法2:
dateparse = lambda x: pd.datetime.strptime(x, '%Y%m%d %H:%M:%S')
dateparse = lambda x: pd.to_datetime(x,format='%Y%m%d %H:%M:%S',errors='ignore')# 知道日期格式
df = pd.read_csv(StringIO(data),header=None, parse_dates=date_spec ,
index_col='date1', date_parser=dateparse)#date1’列作為索引
date2 0 4
date1
0 2019-01-27 19:00:00 2019-01-27 18:56:00 tcy 0.81
1 2019-01-27 20:00:00 2019-01-27 19:56:00 tcy 0.01
2 2019-01-27 21:00:00 2019-01-27 20:56:00 tcy -0.59
3 2019-01-27 21:00:00 2019-01-27 21:18:00 tcy -0.99
4 2019-01-27 22:00:00 2019-01-27 21:56:00 tcy -0.59
5 2019-01-27 23:00:00 2019-01-27 22:56:00 tcy -0.59
# 如格式非標準,用自定義date_parser功能。為了獲得最佳效能,應該進行向量化,即它應該接受陣列作為引數。
# 您可以在date_converters.py中瀏覽日期解析功能 並新增自己的日期解析功能 。
# date_converters.py包含解析雙日期和時間列,年/月/日列以及年/月/日/小時/分/秒列的函式。
# 它還包含一個 generic_parser函式,因此您可以使用一個函式處理它,該函式處理單個日期而不是整個陣列。
例項4:推斷格式infer_datetime_format=True
# 使用條件:parse_dates啟用;字串的格式相同;獲得較大的加速
可猜到日期:
# “20181230”“2018/12/30”“20181230 00:00:00”“12/30/2018 00:00:00”
# “30 / Dec / 2018 00:00:00”“30 / December / 2018 00:00:00”
dayfirst=True # 猜測“01/12/2018”是12月1日。
dayfirst=False #(預設)猜測“01/12/2018”為1月12日。
# Try to infer the format for the index column
data=' date A B C\n' \
'2018-01-01 a 1 2\n' \
'2018-01-02 b 3 4\n' \
'2018-01-03 c 4 5 '
pd.read_csv(StringIO(data), index_col=0,sep='\s+',engine='python',
parse_dates=True,infer_datetime_format=True)
A B C
date
2018-01-01 a 1 2
2018-01-02 b 3 4
2018-01-03 c 4 5
例項5:dayfirst國際日期格式
# 日期格式MM / DD / YYYY美國,DD / MM / YYYY
data=' date,value,cat\n' \
'1/6/2018,5,a\n' \
'2/6/2018,10,b\n' \
'3/6/2018,15,c'
df=pd.read_csv(StringIO(data), parse_dates=[0])
date value cat
0 2018-01-06 5 a #1月6日
1 2018-02-06 10 b
2 2018-03-06 15 c
df[' date'].dt.day
Out[60]:
0 6
1 6
2 6
Name: date, dtype: int64
df[' date'].dt.month
Out[61]:
0 1
1 2
2 3
df=pd.read_csv(StringIO(data),dayfirst=True, parse_dates=[0])
date value cat
0 2018-06-01 5 a #6月1日
1 2018-06-02 10 b
2 2018-06-03 15 c
df.columns # Index([' date', 'value', 'cat'], dtype='object')
df=pd.read_csv(StringIO(data), parse_dates=[0],skipinitialspace=True)#刪除分隔符前後空白
df.columns #Index(['date', 'value', 'cat'], dtype='object')
例項6:
data='date time value\n' \
'2018-12-26 09:40:18 48.1\n' \
'2018-12-27 09:40:19 47.33\n' \
'2018-12-28 09:40:20 42.27'
df= pd.read_csv(StringIO(data),sep='\s+', engine='python')
pd.to_datetime(df.date+df.time,format='%Y-%m-%d%H:%M:%S')#結果同下
(df.date+df.time).apply(lambda x:datetime.datetime.strptime(x, '%Y-%m-%d%H:%M:%S'))
0 2018-12-26 09:40:18
1 2018-12-27 09:40:19
2 2018-12-28 09:40:20
dtype: datetime64[ns]
例項7: 綜合日期
data=' date A B C D\n' \
'0 2019-01-01 0.26 -0.39 -0.21 1.18\n' \
'1 2019-01-02 -1.17 -0.34 0 -0.2\n' \
'2 2019-01-03 -1.73 0.53 2.0 -0.51\n' \
'3 2019-01-04 -1.5 1.45 0.23 -1.15'
dateparse = lambda x: pd.datetime.strptime(x,'%Y-%m-%d')
df=pd.read_csv(StringIO(data),sep =r'\s+',engine='python', #空格分割
parse_dates = [ 'date' ],date_parser=dateparse, #指定date列的日期格式
dayfirst = True, #推斷日期為月,日
index_col =0, #第一列用作索引
na_values=['NO CLUE', 'N/A', '0'], #0被替換為Na值
dtype={'D': int}) #D列的資料為int
date A B C D
NaN 2019-01-01 0.26 -0.39 -0.21 1
1.0 2019-01-02 -1.17 -0.34 NaN 0#1月2日
2.0 2019-01-03 -1.73 0.53 2.00 0
3.0 2019-01-04 -1.50 1.45 0.23 -1
注意:
1)如果列或索引包含不可解析的日期,則整個列或索引將作為物件資料型別以不變的方式返回。
2)對於非標準日期時間解析,請to_datetime()在之後使用pd.read_csv。
3)read_csv有一個fast_path,用於解析iso8601格式日期時間字串,如“2018-01-01T00:01:02 + 00:00”和類似的變體。
如果您可以安排資料以此格式儲存日期時間,則載入時間將顯著加快,已觀察到約20倍。