日期獲取
獲取當前日期
import datetime
# 獲取今天(現在時間)
today = datetime.datetime.today()
# 昨天
yesterday = today - datetime.timedelta(days=1)
# 明天
tomorrow = today + datetime.timedelta(days=1)
Python獲取當前年/月/日
import datetime
datetime.datetime.now().year
datetime.datetime.now().month
datetime.datetime.now().day
從0.15.0開始(2014年9月底發布),現在可以使用新的.dt訪問器進行以下操作:
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
df['Day'] = df['Date'].dt.day
pandas讀取excel文件時指定列的格式
import pandas as pd
file_name ='RB30A1.xlsx'
jsh_list =pd.read_excel(file_name, dtype={'交易編號':str,'交易日期':'datetime64'},header =2)
dt.strftime 獲取年月日字符型數據
對於datetime64[ns]類型的數據,可以直接用dt.strftime提取;如果是object數據類型,則要先用pd.to_datetime()轉換一下,例如:
pd.to_datetime(df.日期).dt.strftime('%Y-%m-%d')
Out[1]:
20 2020-12-07
21 2020-12-07
22 2020-12-07
23 2020-12-07
24 2020-12-07
...
Name: 轉貼日期, Length: 3723, dtype: object
pd.to_datetime(df.日期).dt.strftime('%Y%m')
Out[2]:
20 202012
21 202012
22 202012
23 202012
24 202012
#以下是手工轉的方式:
f = lambda x: str(x)[0:7] #設置規則,把日期列轉為str再提取前8個字符,即年和月
df['YM'] = df.日期.apply(f) #插入一列
pd.to_datetime(df.日期).dt.strftime('%Y/%m/%d')
Out[3]:
20 2020/12/07
21 2020/12/07
22 2020/12/07
23 2020/12/07
24 2020/12/07
dt還有其它用法,比如,dt.year,dt.month,dt.day,dt.hour,dt.time,dt.quarter,dt.weekday,dt.dayofyear ... 結尾沒有()
日期計算
在當前日期上加一天
tom = today + datetime.timedelta(days=1)
tom
Out[2]: datetime.date(2020, 11, 3)
指定兩日,計算差
from datetime import datetime
cur_day = datetime(2019, 7, 30)
next_day = datetime(2019, 7, 31)
print((next_day - cur_day).days)
pandas 兩列日期(object)相減求期限
#兩列日期相減,得到天數的數字
df['tenor'] = ((df['date_maturity'])-df['date_discount']).dt.days #不用dt.days計算出來的結果是timedelta64[ns]類型,加上dt.days就是數值型int64
#兩日期相減,再用astype方法把天數換成年
df['days'] = df['date_maturity'])-df['date_discount']
df['years'] = df['days'].astype('timedelta64[Y]')
#麻煩一點的,先用to_datetime把該列轉為日期
df['new_tenor'] = (pd.to_datetime(df['date_maturity'])-pd.to_datetime(df['date_discount'])).dt.days + df['adjust_day']
#一列日期和一個固定日期相減
import time,datetime
date_query= datetime.date.today()
df['tenor'] = ((df['date_maturity'])-date_query).dt.days
日期生成
Pandas時間序列:生成指定范圍的日期
pandas.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, closed=None, **kwargs)
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.date_range.html
import pandas as pd
pd.date_range('11/1/2018','11/9/2018')
從指定日期生成指定天數的日期序列
import pandas as pd
import numpy as np
print pd.date_range(end='11/1/2018',periods=7)
以每月最后一個工作日為周期
import pandas as pd
print pd.date_range('1/1/2018','12/1/2018',freq='BM')
日期格式轉換
numpy.datetime64 轉為 pandas的日期格式
bond_dates =
array(['2012-09-10T00:00:00.000000000', '2013-01-11T00:00:00.000000000',
'2013-02-08T00:00:00.000000000', '2013-03-18T00:00:00.000000000',
'2014-06-01T00:00:00.000000000', '2014-12-07T00:00:00.000000000',
'2015-04-25T00:00:00.000000000', '2015-12-02T00:00:00.000000000',
'2016-02-16T00:00:00.000000000', '2016-06-08T00:00:00.000000000',
'2016-10-19T00:00:00.000000000', '2017-02-15T00:00:00.000000000',
'2017-07-21T00:00:00.000000000', '2018-01-27T00:00:00.000000000',
'2018-07-06T00:00:00.000000000', '2018-10-12T00:00:00.000000000',
'2019-03-07T00:00:00.000000000', '2020-05-12T00:00:00.000000000',
'2020-06-24T00:00:00.000000000', '2021-01-19T00:00:00.000000000',
'2021-03-16T00:00:00.000000000', '2021-06-16T00:00:00.000000000',
'2021-08-18T00:00:00.000000000', '2021-11-17T00:00:00.000000000',
'2022-02-23T00:00:00.000000000'], dtype='datetime64[ns]')
這種日期太長, 怎么轉短一些?
import pandas as pd
pd_dates = pd.to_datetime(bond_dates)
#得到:
pd_dates
Out[1]:
DatetimeIndex(['2012-09-10', '2013-01-11', '2013-02-08', '2013-03-18',
'2014-06-01', '2014-12-07', '2015-04-25', '2015-12-02',
'2016-02-16', '2016-06-08', '2016-10-19', '2017-02-15',
'2017-07-21', '2018-01-27', '2018-07-06', '2018-10-12',
'2019-03-07', '2020-05-12', '2020-06-24', '2021-01-19',
'2021-03-16', '2021-06-16', '2021-08-18', '2021-11-17',
'2022-02-23'],
dtype='datetime64[ns]', freq=None)
python datetime 和 Quantlib 里的datetime的轉換
import QuantLib as ql
from datetime import datetime,date,timedelta
today = (date.today() + timedelta(days = 0)).strftime("%Y-%m-%d") #可以通過調節days = 正負天數,來得到自今日起的日期位移
Today = ql.Date(today,'%Y-%m-%d')
datetime.datetime轉為datetime.date
from datetime import datetime,date
today = date.today()
#today: datetime.date(2020, 12, 24)
date_valuation = '2020-12-22' #str
date_value = datetime.strptime(date_valuation,"%Y-%m-%d") #類型是:datetime.datetime(2020, 12, 22, 0, 0)
date_value = datetime.strptime(date_valuation,"%Y-%m-%d").date() #type: datetime.date(2020, 12, 22)
強行把一列轉化為日期格式(在原dataframe里已改變)
#針對'2020-01-01' 這種str有效, 以下兩句等效
dataframe.column_name.astype('datetime64[ns]')
df.column_name = pd.to_datetime(df.column_name)
把一列長日期轉換為短日期:
#bond_sql.deal_time:
0 2018-04-09 14:34:41
1 2018-04-10 14:23:56
2 2018-04-16 09:53:42
3 2018-04-23 14:21:50
4 2018-05-07 13:57:13
from datetime import datetime
bond_sql.deal_time = list(map(lambda t: datetime.date(t),bond_sql.deal_time))
如果直接用import datetime,則上面的datetime.date(t)要寫成:datetime.datetime.date(t)
0 2018-04-09
1 2018-04-10
2 2018-04-16
3 2018-04-23
4 2018-05-07
另外一種情況,源表中的8位數字的日期20170110轉為 2017-01-10的日期格式 :
data_list.日期
0 20170110
1 20170111
2 20170112
3 20170113
4 20170119
Name: 日期, Length: 5, dtype: object
pd.to_datetime(data_list.日期,format='%Y%m%d')
Out:
0 2017-01-10
1 2017-01-11
2 2017-01-12
3 2017-01-13
4 2017-01-19
Name: 日期, Length: 5, dtype: datetime64[ns]
#賦值:
data_list.日期 = pd.to_datetime(data_list.日期,format='%Y%m%d')
把一個字符串轉化為日期格式
import datetime
deal_date = '2021/01/05'
t1=datetime.datetime.strptime(deal_date,'%Y/%m/%d')
#Out: datetime.datetime(2021, 1, 5, 0, 0)
t1=datetime.datetime.strptime(deal_date,'%Y/%m/%d').date()
#Out: datetime.date(2021, 1, 5)
Calendar模塊獲取某月日歷
Calendar模塊有很廣泛的方法用來處理年歷和月歷,例如打印某月的月歷:
import calendar
cal = calendar.month(2016, 1)
print "以下輸出2016年1月份的日歷:"
print cal
以上實例輸出結果:
以下輸出2016年1月份的日歷:
January 2016
Mo Tu We Th Fr Sa Su
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
參考資料:
計算兩個日期間隔年月日(帶閏年判斷)
日期天數差計算(Python)
利用Python中的pandas(date_range)庫生成時間序列(time series)
https://www.cnblogs.com/OliverQin/p/12283897.html
獲取中國日歷
https://www.pypandas.cn/docs/user_guide/timeseries.html#時間戳-vs-時間段
https://www.cnblogs.com/lemonbit/p/6896499.html