52_Pandas處理日期和時間列(字符串轉換、日期提取等)
將解釋如何操作表示 pandas.DataFrame 的日期和時間(日期和時間)的列。字符串與 datetime64[ns] 類型的相互轉換,將日期和時間提取為數(shù)字的方法等。
以下內(nèi)容進行說明。
將字符串轉換為 datetime64[ns] 類型(時間戳類型):to_datetime()
時間戳類型屬性/方法
使用 dt 訪問器批量處理整個列
提取日期、星期幾等。
將日期時間轉換為任何格式的字符串
轉換為 Python 數(shù)據(jù)幀類型,NumPy datetime64[ns] 類型數(shù)組
對于 dt 中未提供的方法
對于日期時間索引
從文件讀取時將字符串轉換為 datetime64[ns] 類型
如何將 datetime64[ns] 類型指定為索引并將其處理為時序數(shù)據(jù)以及如何使用,請參考以下文章。
- 26_Pandas.DataFrame時間序列數(shù)據(jù)的處理
- 27_Pandas按星期,月份,季度和年份的天計算時間序列數(shù)據(jù)的總計和平均值
以帶有以下 csv 文件的 pandas.DataFrame 為例。
import pandas as pd
import datetime
df = pd.read_csv('./data/sample_datetime_multi.csv')
print(df)
# A B
#0 2017-11-01 12:24 2017年11月1日 12時24分
#1 2017-11-18 23:00 2017年11月18日 23時00分
#2 2017-12-05 5:05 2017年12月5日 5時05分
#3 2017-12-22 8:54 2017年12月22日 8時54分
#4 2018-01-08 14:20 2018年1月8日 14時20分
#5 2018-01-19 20:01 2018年1月19日 20時01分
將字符串轉換為 datetime64[ns] 類型(時間戳類型):to_datetime()
使用 pandas.to_datetime() 函數(shù),您可以將表示日期和時間的字符串列 pandas.Series 轉換為 datetime64[ns] 類型。
print(pd.to_datetime(df['A']))
# 0 2017-11-01 12:24:00
# 1 2017-11-18 23:00:00
# 2 2017-12-05 05:05:00
# 3 2017-12-22 08:54:00
# 4 2018-01-08 14:20:00
# 5 2018-01-19 20:01:00
# Name: A, dtype: datetime64[ns]
如果格式不標準,請在參數(shù)格式中指定格式字符串。
print(pd.to_datetime(df['B'], format='%Y年%m月%d日 %H時%M分'))
# 0 2017-11-01 12:24:00
# 1 2017-11-18 23:00:00
# 2 2017-12-05 05:05:00
# 3 2017-12-22 08:54:00
# 4 2018-01-08 14:20:00
# 5 2018-01-19 20:01:00
# Name: B, dtype: datetime64[ns]
即使原始格式不同,如果指示的日期和時間相同,則 datetime64[ns] 類型值是等價的。
print(pd.to_datetime(df['A']) == pd.to_datetime(df['B'], format='%Y年%m月%d日 %H時%M分'))
# 0 True
# 1 True
# 2 True
# 3 True
# 4 True
# 5 True
# dtype: bool
如果要將轉換為 datetime64[ns] 類型的列作為新列添加到 pandas.DataFrame,請指定新列名并分配它。如果您指定原始列名,它將被覆蓋。
df['X'] = pd.to_datetime(df['A'])
print(df)
# A B X
#0 2017-11-01 12:24 2017年11月1日 12時24分 2017-11-01 12:24:00
#1 2017-11-18 23:00 2017年11月18日 23時00分 2017-11-18 23:00:00
#2 2017-12-05 5:05 2017年12月5日 5時05分 2017-12-05 05:05:00
#3 2017-12-22 8:54 2017年12月22日 8時54分 2017-12-22 08:54:00
#4 2018-01-08 14:20 2018年1月8日 14時20分 2018-01-08 14:20:00
#5 2018-01-19 20:01 2018年1月19日 20時01分 2018-01-19 20:01:00
時間戳類型屬性/方法
pandas.to_datetime() 函數(shù)轉換的列的dtype是datetime64[ns]類型,每個元素都是Timestamp類型。
print(df)
# A B X
# 0 2017-11-01 12:24 2017年11月1日 12時24分 2017-11-01 12:24:00
# 1 2017-11-18 23:00 2017年11月18日 23時00分 2017-11-18 23:00:00
# 2 2017-12-05 5:05 2017年12月5日 5時05分 2017-12-05 05:05:00
# 3 2017-12-22 8:54 2017年12月22日 8時54分 2017-12-22 08:54:00
# 4 2018-01-08 14:20 2018年1月8日 14時20分 2018-01-08 14:20:00
# 5 2018-01-19 20:01 2018年1月19日 20時01分 2018-01-19 20:01:00
print(df.dtypes)
# A object
# B object
# X datetime64[ns]
# dtype: object
print(df['X'][0])
# 2017-11-01 12:24:00
print(type(df['X'][0]))
# <class 'pandas._libs.tslib.Timestamp'>
Timestamp 類型繼承并擴展了 Python 標準庫 datetime 的 datetime 類型。
print(issubclass(pd.Timestamp, datetime.datetime))
# True
可以獲取年、月、日(年、月、日)、時、分、秒(時、分、秒)、星期幾(字符串:weekday_name,數(shù)字:dayofweek)等作為屬性。
print(df['X'][0].year)
# 2017
print(df['X'][0].weekday_name)
# Wednesday
還可以使用 to_pydatetime() 轉換為 Python 標準庫 datetime 類型,使用 to_datetime64() 轉換為 NumPy datetime64[ns] 類型。
py_dt = df['X'][0].to_pydatetime()
print(type(py_dt))
# <class 'datetime.datetime'>
dt64 = df['X'][0].to_datetime64()
print(type(dt64))
# <class 'numpy.datetime64'>
timestamp() 是一種以浮點浮點類型返回 UNIX 時間(紀元秒 = 自 1970 年 1 月 1 日 00:00:00 以來的秒數(shù))的方法。如果需要整數(shù),請使用 int()。
print(df['X'][0].timestamp())
# 1509539040.0
print(pd.to_datetime('1970-01-01 00:00:00').timestamp())
# 0.0
print(int(df['X'][0].timestamp()))
# 1509539040
與 Python 標準庫中的 datetime 類型一樣,strftime() 可用于轉換為任何格式的字符串。請參閱下文,了解如何將其應用于列的所有元素。
print(df['X'][0].strftime('%Y/%m/%d'))
# 2017/11/01
使用 dt 訪問器批量處理整個列
有一個 str 訪問器將字符串處理應用于整個 pandas.Series。
- 13_Pandas字符串的替換和空格處刪除等方法
提取日期、星期幾。
與Timestamp類型一樣,年、月、日(年、月、日)、時、分、秒(時、分、秒)、星期幾(字符串:weekday_name,數(shù)字:dayofweek)等都可以作為屬性獲得。 在 dt 之后寫下每個屬性名稱。 pandas.Series 的每個元素都被處理并返回 pandas.Series。
print(df['X'].dt.year)
# 0 2017
# 1 2017
# 2 2017
# 3 2017
# 4 2018
# 5 2018
# Name: X, dtype: int64
print(df['X'].dt.hour)
# 0 12
# 1 23
# 2 5
# 3 8
# 4 14
# 5 20
# Name: X, dtype: int64
也可以使用 dayofweek(星期一為 0,星期日為 6)僅提取一周中特定日期的行。
print(df['X'].dt.dayofweek)
# 0 2
# 1 5
# 2 1
# 3 4
# 4 0
# 5 4
# Name: X, dtype: int64
print(df[df['X'].dt.dayofweek == 4])
# A B X
# 3 2017-12-22 8:54 2017年12月22日 8時54分 2017-12-22 08:54:00
# 5 2018-01-19 20:01 2018年1月19日 20時01分 2018-01-19 20:01:00
將日期時間轉換為任何格式的字符串
當使用 astype() 方法將 datetime64[ns] 類型的列轉換為字符串 str 類型時,它會轉換為標準格式的字符串。
print(df['X'].astype(str))
# 0 2017-11-01 12:24:00
# 1 2017-11-18 23:00:00
# 2 2017-12-05 05:05:00
# 3 2017-12-22 08:54:00
# 4 2018-01-08 14:20:00
# 5 2018-01-19 20:01:00
# Name: X, dtype: object
dt.strftime() 可用于一次將列轉換為任何格式的字符串。也可以使其成為僅具有日期或僅具有時間的字符串。
print(df['X'].dt.strftime('%A, %B %d, %Y'))
# 0 Wednesday, November 01, 2017
# 1 Saturday, November 18, 2017
# 2 Tuesday, December 05, 2017
# 3 Friday, December 22, 2017
# 4 Monday, January 08, 2018
# 5 Friday, January 19, 2018
# Name: X, dtype: object
print(df['X'].dt.strftime('%Y年%m月%d日'))
# 0 2017年11月01日
# 1 2017年11月18日
# 2 2017年12月05日
# 3 2017年12月22日
# 4 2018年01月08日
# 5 2018年01月19日
# Name: X, dtype: object
如果要將轉換為字符串的列作為新列添加到 pandas.DataFrame,請指定新列名并分配它。如果您指定原始列名,它將被覆蓋。
df['en'] = df['X'].dt.strftime('%A, %B %d, %Y')
df['cn'] = df['X'].dt.strftime('%Y年%m月%d日')
print(df)
# A B X \
# 0 2017-11-01 12:24 2017年11月1日 12時24分 2017-11-01 12:24:00
# 1 2017-11-18 23:00 2017年11月18日 23時00分 2017-11-18 23:00:00
# 2 2017-12-05 5:05 2017年12月5日 5時05分 2017-12-05 05:05:00
# 3 2017-12-22 8:54 2017年12月22日 8時54分 2017-12-22 08:54:00
# 4 2018-01-08 14:20 2018年1月8日 14時20分 2018-01-08 14:20:00
# 5 2018-01-19 20:01 2018年1月19日 20時01分 2018-01-19 20:01:00
# en cn
# 0 Wednesday, November 01, 2017 2017年11月01日
# 1 Saturday, November 18, 2017 2017年11月18日
# 2 Tuesday, December 05, 2017 2017年12月05日
# 3 Friday, December 22, 2017 2017年12月22日
# 4 Monday, January 08, 2018 2018年01月08日
# 5 Friday, January 19, 2018 2018年01月19日
轉換為 Python 數(shù)據(jù)幀類型,NumPy datetime64[ns] 類型數(shù)組
可以使用 dt.to_pydatetime() 獲得一個 NumPy 數(shù)組 ndarray,其元素是 Python 標準庫的日期時間類型對象。
print(df['X'].dt.to_pydatetime())
# [datetime.datetime(2017, 11, 1, 12, 24)
# datetime.datetime(2017, 11, 18, 23, 0)
# datetime.datetime(2017, 12, 5, 5, 5)
# datetime.datetime(2017, 12, 22, 8, 54)
# datetime.datetime(2018, 1, 8, 14, 20)
# datetime.datetime(2018, 1, 19, 20, 1)]
print(type(df['X'].dt.to_pydatetime()))
print(type(df['X'].dt.to_pydatetime()[0]))
# <class 'numpy.ndarray'>
# <class 'datetime.datetime'>
NumPy的datetime64[ns]類型數(shù)組可以用values屬性代替方法獲取。
print(df['X'].values)
# ['2017-11-01T12:24:00.000000000' '2017-11-18T23:00:00.000000000'
# '2017-12-05T05:05:00.000000000' '2017-12-22T08:54:00.000000000'
# '2018-01-08T14:20:00.000000000' '2018-01-19T20:01:00.000000000']
print(type(df['X'].values))
print(type(df['X'].values[0]))
# <class 'numpy.ndarray'>
# <class 'numpy.datetime64'>
對于 dt 中未提供的方法
例如,Timestamp 類型有一個返回 UNIX 時間(秒)的方法 (timestamp()),但 dt 訪問器沒有。在這種情況下,使用 map() 即可。
- 06_Pandas中map(),applymap(),apply()函數(shù)的使用方法
print(df['X'].map(pd.Timestamp.timestamp))
# 0 1.509539e+09
# 1 1.511046e+09
# 2 1.512450e+09
# 3 1.513933e+09
# 4 1.515421e+09
# 5 1.516392e+09
# Name: X, dtype: float64
如果要轉換為整數(shù) int 類型,請使用 astype() 方法。
print(df['X'].map(pd.Timestamp.timestamp).astype(int))
# 0 1509539040
# 1 1511046000
# 2 1512450300
# 3 1513932840
# 4 1515421200
# 5 1516392060
# Name: X, dtype: int64
對于日期時間索引
在處理時間序列數(shù)據(jù)時非常有用。有關詳細信息,請參閱下面的文章。
- 26_Pandas.DataFrame時間序列數(shù)據(jù)的處理
- 27_Pandas按星期,月份,季度和年份的天計算時間序列數(shù)據(jù)的總計和平均值
在示例中,set_index() 用于將現(xiàn)有列指定為索引,為方便起見,使用 drop() 方法刪除多余的列。
- 12_Pandas.DataFrame刪除指定行和列(drop)
- 22_Pandas.DataFrame,重置列的行名(set_index)
df_i = df.set_index('X').drop(['en', 'cn'], axis=1)
print(df_i)
# A B
# X
# 2017-11-01 12:24:00 2017-11-01 12:24 2017年11月1日 12時24分
# 2017-11-18 23:00:00 2017-11-18 23:00 2017年11月18日 23時00分
# 2017-12-05 05:05:00 2017-12-05 5:05 2017年12月5日 5時05分
# 2017-12-22 08:54:00 2017-12-22 8:54 2017年12月22日 8時54分
# 2018-01-08 14:20:00 2018-01-08 14:20 2018年1月8日 14時20分
# 2018-01-19 20:01:00 2018-01-19 20:01 2018年1月19日 20時01分
print(df_i.index)
# DatetimeIndex(['2017-11-01 12:24:00', '2017-11-18 23:00:00',
# '2017-12-05 05:05:00', '2017-12-22 08:54:00',
# '2018-01-08 14:20:00', '2018-01-19 20:01:00'],
# dtype='datetime64[ns]', name='X', freq=None)
DatetimeIndex 類型索引具有年、月、日(年、月、日)、時、分、秒(時、分、秒)、星期幾(字符串:weekday_name,數(shù)字:dayofweek)等屬性,以及方法如由于提供了 strftime(),因此可以一次處理所有索引元素,而無需通過 dt 屬性。
返回類型因屬性和方法而異,不是pandas.Series,但如果要在pandas.DataFrame中添加新列,可以指定新列名并分配。
print(df_i.index.minute)
# Int64Index([24, 0, 5, 54, 20, 1], dtype='int64', name='X')
print(df_i.index.strftime('%y/%m/%d'))
# ['17/11/01' '17/11/18' '17/12/05' '17/12/22' '18/01/08' '18/01/19']
df_i['min'] = df_i.index.minute
df_i['str'] = df_i.index.strftime('%y/%m/%d')
print(df_i)
# A B min str
# X
# 2017-11-01 12:24:00 2017-11-01 12:24 2017年11月1日 12時24分 24 17/11/01
# 2017-11-18 23:00:00 2017-11-18 23:00 2017年11月18日 23時00分 0 17/11/18
# 2017-12-05 05:05:00 2017-12-05 5:05 2017年12月5日 5時05分 5 17/12/05
# 2017-12-22 08:54:00 2017-12-22 8:54 2017年12月22日 8時54分 54 17/12/22
# 2018-01-08 14:20:00 2018-01-08 14:20 2018年1月8日 14時20分 20 18/01/08
# 2018-01-19 20:01:00 2018-01-19 20:01 2018年1月19日 20時01分 1 18/01/19
從文件讀取時將字符串轉換為 datetime64[ns] 類型
從文件中讀取數(shù)據(jù)時,可以在讀取時將字符串轉換為 datetime64[ns] 類型。 對于 pandas.read_csv() 函數(shù),在參數(shù) parse_dates 中指定要轉換為 datetime64[ns] 類型的列號列表。請注意,即使只有一個,也必須列出。
df_csv = pd.read_csv('data/sample_datetime_multi.csv', parse_dates=[0])
print(df_csv)
# A B
# 0 2017-11-01 12:24:00 2017年11月1日 12時24分
# 1 2017-11-18 23:00:00 2017年11月18日 23時00分
# 2 2017-12-05 05:05:00 2017年12月5日 5時05分
# 3 2017-12-22 08:54:00 2017年12月22日 8時54分
# 4 2018-01-08 14:20:00 2018年1月8日 14時20分
# 5 2018-01-19 20:01:00 2018年1月19日 20時01分
print(df_csv.dtypes)
# A datetime64[ns]
# B object
# dtype: object
df_csv_jp = pd.read_csv('./data/sample_datetime_multi.csv',
parse_dates=[1],
date_parser=lambda date: pd.to_datetime(date, format='%Y年%m月%d日 %H時%M分'))
print(df_csv_jp)
# A B
# 0 2017-11-01 12:24 2017-11-01 12:24:00
# 1 2017-11-18 23:00 2017-11-18 23:00:00
# 2 2017-12-05 5:05 2017-12-05 05:05:00
# 3 2017-12-22 8:54 2017-12-22 08:54:00
# 4 2018-01-08 14:20 2018-01-08 14:20:00
# 5 2018-01-19 20:01 2018-01-19 20:01:00
print(df_csv_jp.dtypes)
# A object
# B datetime64[ns]
# dtype: object
可以使用參數(shù) index_col 指定要索引的列。
- 03_Pandas讀取csv/tsv文件(read_csv,read_table)
在這種情況下,如果參數(shù) parse_dates=True,索引列將被轉換為 datetime64[ns] 類型。文章來源:http://www.zghlxwxcb.cn/news/detail-815116.html
df_csv_jp_i = pd.read_csv('./data/sample_datetime_multi.csv',
index_col=1,
parse_dates=True,
date_parser=lambda date: pd.to_datetime(date, format='%Y年%m月%d日 %H時%M分'))
print(df_csv_jp_i)
# A
# B
# 2017-11-01 12:24:00 2017-11-01 12:24
# 2017-11-18 23:00:00 2017-11-18 23:00
# 2017-12-05 05:05:00 2017-12-05 5:05
# 2017-12-22 08:54:00 2017-12-22 8:54
# 2018-01-08 14:20:00 2018-01-08 14:20
# 2018-01-19 20:01:00 2018-01-19 20:01
print(df_csv_jp_i.index)
# DatetimeIndex(['2017-11-01 12:24:00', '2017-11-18 23:00:00',
# '2017-12-05 05:05:00', '2017-12-22 08:54:00',
# '2018-01-08 14:20:00', '2018-01-19 20:01:00'],
# dtype='datetime64[ns]', name='B', freq=None)
讀取 Excel 文件的 pandas.read_excel() 函數(shù)也有參數(shù) parse_dates、date_parser 和 index_col,因此在讀取時也可以進行類似的轉換。有關 pandas.read_excel() 函數(shù)的信息,請參閱以下文章。文章來源地址http://www.zghlxwxcb.cn/news/detail-815116.html
- 50_Pandas讀取 Excel 文件 (xlsx, xls)
到了這里,關于52_Pandas處理日期和時間列(字符串轉換、日期提取等)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!