python的日期運算


日期獲取

獲取當前日期

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM