python時間戳(1)


一、 時間戳定義:其實就是在歷史長河中釘了一個釘子,獨一無二不說,還可以用一串數字表示

二、 時間戳怎么產生:

  (1) 可以自己輸入

    a. 一個是datetime()## 后面所有datetime都可以按下列方式變為timestamp

1 from datetime import datetime 2 import pandas as pd 3 stamp1=datetime.now() 4 stamp=pd.Timestamp(stamp1) 5 stamp.value
1576506889855183000 
   b. 一個是timestamp()
import pandas as pd stamp2=pd.Timestamp('2019,12,16') stamp2.value
1576454400000000000

  (2) 可以從文本中分析出來,分析器為parse(中文解釋:做句法分析)

from dateutil.parser import parse
parse('2019-12-10')
datetime.datetime(2019, 12, 10, 0, 0)
年 月 日 小時 分鍾
如果不是12月10日而是10月12日呢?
from dateutil.parser import parse
parse('2019-12-10',dayfirst=True)
datetime.datetime(2019, 10, 12, 0, 0)
文本寫出花來了怎么變成我想要的日期格式?你告訴它什么是什么就好了
但這需要對基本的日期表達進行說明:
%Y 2019(四位數年份)
%y 19(二位數年份)
%m 12(月份)
%d 16(日期)
%H 15(24小時制)
%I 3(12小時制)
%M 06(分鍾)
%S 14(秒)
%w 星期幾(0是星期天,6是星期一)
%U 一年中第幾個星期(從00到53),以星期天為一周的第一天
%W 一年中第幾個星期(從00到53),以星期一為一周的第一天
%z 時區
%F 2019-12-16
%D 12/16/2019
from datetime import datetime
try_trans='2019#12#10'
datetime.strptime(try_trans,'%Y#%m#%d') ## 分開看是:str(文本) p(變) time(時間)
datetime.datetime(2019, 12, 10, 0, 0)
建議可以直接用parse試一下,基本上python都可以解析
from dateutil.parser import parse
parse('DEC 16,2019 15:02')
datetime.datetime(2019, 12, 16, 15, 2)

三、 時間戳的移動:其實就是撥動手表指針的工作后重新變了一個新的釘子

  (1) 重新找個釘子一次性到位(DateOffset)

    首先看看DateOffset(里面可以加什么頻率?)     

 |      - years
 |      - months
 |      - weeks
 |      - days
 |      - hours
 |      - minutes
 |      - seconds
 |      - microseconds
 |      - nanoseconds

 

from pandas.tseries.offsets import * #關鍵詞分開:t series時間序列/off sets 參照系、定位
now=datetime.now()        ##datetime.datetime(2019, 12, 16, 16, 15, 2, 561839)
now+DateOffset(days=3)#天數相加  Timestamp('2019-12-19 16:34:35.850953')
now+DateOffset(months=3)#月數相加 Timestamp('2020-03-16 16:10:58.030667')

(2) 先定位后滾動 --此方法只能對前一個后一個進行操作
  首先看看有哪些定位?
先把日期點挪到前、中、后,再滾動
| - SemiMonthEnd | - MonthEnd | - WeekOfMonth | - QuarterEnd | - BQuarterEnd | - YearEnd | - BYearEnd |
| - SemiMonthBegin| - MonthBegin| - LastWeekOfMonth| - QuarterBegin| - BQuarterBegin | - YearBegin| - BYearBegin |
##定位
offset=MonthEnd() #月底
## 滾動
offset.rollforward(now) #本月月底 Timestamp('2019-12-31 16:34:35.850953')
offset.rollback(now)#上個月月底 Timestamp('2019-11-30 16:34:35.850953')

##定位
offset=SemiMonthEnd()#月半、月中
##滾動
offset.rollforward(now)#月半、月中到底就是月底 Timestamp('2019-12-31 16:34:35.850953')
offset.rollback(now)# 月半到頭就是月中 Timestamp('2019-12-15 16:34:35.850953')

##定位
offset=WeekOfMonth()#位於星期幾
##滾動
offset.rollforward(now)#本月第一周的星期幾 Timestamp('2020-01-06 16:34:35.850953')
offset.rollback(now)#下個月第一周的星期幾 Timestamp('2019-12-02 16:34:35.850953')

##定位
offset=LastWeekOfMonth()#位於星期幾
##滾動
offset.rollforward(now)#本月最后一周的星期幾 Timestamp('2019-12-30 16:34:35.850953')
offset.rollback(now)#下個月最后一周的星期幾
Timestamp('2019-12-02 16:34:35.850953')
(3) 根據習慣日期定位方式定位
首先看看有哪些定位?之前運用的都可以,加上數字即可
| - SemiMonthEnd  | - MonthEnd  | - WeekOfMonth    | - QuarterEnd  | - BQuarterEnd   | - YearEnd  | - BYearEnd   | 
| - SemiMonthBegin| - MonthBegin| - LastWeekOfMonth| - QuarterBegin| - BQuarterBegin | - YearBegin| - BYearBegin |
| - Hour | - Minute | - Second | -
 
           
now+MonthEnd(2) #往后挪兩個月,這彌補了之前無法定位到當前月的下個月問題 Timestamp('2020-01-31 16:34:35.850953')
 
           

注意:錯誤示范

offset=MonthEnd(2)
offset.rollforward(now) #結果仍然為  Timestamp('2019-12-31 16:34:35.850953'),想要達到2020年1月只能用加的方式

注意:通常情況下我們一般不單獨做時間序列單列,都會跟一些數據,也就是series和dataframe,可以使用shift進行日期變更

 

四、在兩個時間點內按要求添加數據

  這個功能就相當於range(a,b),所以公式也很像date_range(start='開頭日期’,end='結尾日期‘,periods=遞增幾次,freq='頻率')

  1. date_range(‘開頭日期‘,n)

  從開頭日期開始一天一天的列出n天

  2. date_range(‘開頭日期‘,遞增幾次,頻率)

  頻率有以下幾種表示方式:

  a. 天以內

  | - 2(按2天遞增) |-‘3B’(按3天工作日遞增)| - ‘4h’(按四個小時遞增) | - '50min'(按五十分鍾遞增)

  | - '6S'(按六秒遞增)| - ‘7ms’(按七毫秒遞增)|-‘8U’(按八微秒遞增)| - ‘2D4h50min6S7ms8U’ (可以連着寫)

 

pd.date_range('2019-12-16',periods=5,freq='2D4h50min6S7ms8U')
DatetimeIndex(['2019-12-16 00:00:00', '2019-12-18 04:50:06.007008',
               '2019-12-20 09:40:12.014016', '2019-12-22 14:30:18.021024',
               '2019-12-24 19:20:24.028032'],
              dtype='datetime64[ns]', freq='190206007008U')

  b. 周以內

  | - ‘W-TUE’(從開頭日期的當天開始,往后第一個星期二開始,按7天遞增)

 

pd.date_range('2019-12-16',periods=5,freq='W-TUE')
DatetimeIndex(['2019-12-17', '2019-12-24', '2019-12-31', '2020-01-07',
               '2020-01-14'],
              dtype='datetime64[ns]', freq='W-TUE')

  c. 月以內

  |-'WOM-3FRI'(從開頭日期開始月的第3個星期五,按月遞增)

pd.date_range('2019-12-21',periods=5,freq='WOM-3FRI') #注意:如果給出的日期超過本月第三個星期五將跳過本月
DatetimeIndex(['2020-01-17', '2020-02-21', '2020-03-20',
               '2020-04-17'],dtype='datetime64[ns]', freq='WOM-3FRI')

  | -‘6M’(從開頭日期的當月月底開始,按六個月遞增)| - ‘6BM’(從開頭日期的當月最后一個工作日開始,按六個月遞增)

pd.date_range('2019-12-21',periods=5,freq='6M') # 注意:與MS的區別
DatetimeIndex(['2019-12-31', '2020-06-30', '2020-12-31', '2021-06-30',
               '2021-12-31'],
              dtype='datetime64[ns]', freq='6M')
pd.date_range('2018-12-21',periods=5,freq='6BM')
DatetimeIndex(['2018-12-31', '2019-06-28', '2019-12-31', '2020-06-30',
               '2020-12-31'],
              dtype='datetime64[ns]', freq='6BM')

  | -‘7MS ’(從開頭日期的當月月初開始,按七個月遞增)| -‘7BMS’(從開頭日期的當月第一個工作日開始,按七個月遞增)

pd.date_range('2018-12-21',periods=5,freq='7MS') # 注意:如果給定的日期不是月頭開始,那么結果會從下個月月初開始,按七個月遞增
DatetimeIndex(['2019-01-01', '2019-08-01', '2020-03-01', '2020-10-01',
               '2021-05-01'],
              dtype='datetime64[ns]', freq='7MS')
pd.date_range('2018-12-21',periods=5,freq='7BMS')
DatetimeIndex(['2019-01-01', '2019-08-01', '2020-03-02', '2020-10-01',
               '2021-05-03'],
              dtype='datetime64[ns]', freq='7BMS')

  d. 季度以內

  | - ‘Q-FEB’(從二月月底開始,按三個月遞增)|-‘QS-FEB’(從二月月頭開始,按三個月遞增)

  | - 'BQ-FEB'(從二月最后一個工作日開始,按三個月遞增)|-  'BQS-FEB'(從二月第一個工作日開始,按三個月遞增)

pd.date_range('2018-12-01',periods=5,freq='BQ-FEB') 
# Q和QS沒什么注意點,但BQ和BQS需要注意,如果給定的日期已經過了當年二月,則系統會從下月的二月開始顯示
DatetimeIndex(['2019-02-28', '2019-05-31', '2019-08-30', '2019-11-29',
               '2020-02-28'],
              dtype='datetime64[ns]', freq='BQ-FEB')

  e. 年以內

  | - 'A-FEB'(從開頭年份的二月底開始,按年遞增)| - ‘BA-FEB’(從開頭年份的二月最后一個工作日開始,按年遞增

  | - ‘AS-FEB’(從開頭年份的二月初開始,按年遞增)| - ‘BAS-FEB’(從開頭年的二月第一個工作日開始,按年遞增)

pd.date_range('2018-12-01',periods=5,freq='AS-FEB') #同上
DatetimeIndex(['2019-02-01', '2020-02-01', '2021-02-01', '2022-02-01',
               '2023-02-01'],
              dtype='datetime64[ns]', freq='AS-FEB')
-----------------
前文中我們看到有些日期已經超過導致遞延問題,那么我們如何解決這類問題?
我們可以提取年、月來避免
  • 比如前文中pd.date_range('2018-12-01',periods=5,freq='BQ-FEB') 中的問題從年初開始
import pandas as pd
startDate="2018-12-01"
startDateYear=str(pd.to_datetime(startDate).year)
pd.date_range(startDateYear,periods=5,freq='AS-FEB')
DatetimeIndex(['2018-02-01', '2019-02-01', '2020-02-01', '2021-02-01',
               '2022-02-01'],
              dtype='datetime64[ns]', freq='AS-FEB')
  • 比如前文中pd.date_range('2019-12-21',periods=5,freq='WOM-3FRI') 中的問題從月初開始
import pandas as pd
startDate="2019-12-01"
startDateYear=str(pd.to_datetime(startDate).year)
startDateMonth=str(pd.to_datetime(startDate).month)
year_month=startDateYear+'-'+startDateMonth
pd.date_range(year_month,periods=5,freq='WOM-3FRI') 
DatetimeIndex(['2019-12-20', '2020-01-17', '2020-02-21', '2020-03-20',
               '2020-04-17'],
              dtype='datetime64[ns]', freq='WOM-3FRI')

  3. date_range(‘開頭日期‘,‘結束日期’,頻率)

  4. date_range('開頭日期‘,‘結束日期’,遞增幾次)

    按天數等分

 


 



免責聲明!

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



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