1. 程式人生 > >pandas21 讀csv檔案read_csv(11.日期時間)(詳細 tcy)

pandas21 讀csv檔案read_csv(11.日期時間)(詳細 tcy)

日期時間處理 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倍。