時間序列 | 字符串和日期的相互轉換

2021-02-19 數據STUDIO

在數據處理過程中,難免會遇到日期格式,特別是從外部讀取數據到jupyter或其他python編譯器中,用於數據處理分析時。若讀取excel文檔時還能保留原本日期時間格式,但有時卻差強人意,讀取後為字符串格式,尤其是以csv格式存儲的數據。此時就需要用到字符串轉日期格式。

本文將介紹比較常用的字符串與日期格式互轉的方法,是屬於時間序列中部分內容。

datetime.datetimedatetime以毫秒形式存儲日期和時間。

Python標準庫包含用於日期(date)和時間(time)數據的數據類型,而且還有日曆方面的功能。我們主要會用到datetime、time以及calendar模塊。datetime.datetime(也可以簡寫為datetime)是用得最多的數據類型。

>>> from datetime import datetime
>>> now = datetime.now()
>>> now
datetime.datetime(2020, 2, 6, 19, 15, 6, 617163)

>>> now.year
2020
>>> now.month
2
>>> now.day
6

timedelta

timedelta表示兩個datetime對象之間的時間差

>>> delta = datetime.now() - datetime(2016, 4, 3)
>>> delta
datetime.timedelta(days=1404, seconds=69929, microseconds=636512)

>>> delta.days
1404

可以給datetime對象加上(或減去)一個或多個timedelta,這樣會產生一個新對象

>>> from datetime import timedelta
>>> start = datetime(2016,4,3)
>>> start + timedelta(1404)
datetime.datetime(2020, 2, 6, 0, 0)

>>> start - 2* timedelta(1404)
datetime.datetime(2008, 7, 26, 0, 0)

datetime模塊中的數據類型

類型說明date以公曆形式存儲日期(年、月、日)time將時間存儲為時、分、秒、毫秒datetime存儲日期和時間日、秒、毫秒timedelta表示兩個datetime 值之間的差


datetime 轉換為字符串datetime.strftime()

利用str或strftime方法(傳入一個格式化字符串),datetime對象和pandas的Timestamp對象可以被格式化為字符串:

>>> tamp = datetime(2020,5,20)
>>> str(tamp)
'2020-05-20 00:00:00'
>>> tamp.strftime('%Y-%m-%d')
'2020-05-20'
>>> datetime.strftime(tamp, '%Y-%m-%d')
'2020-05-20'

datetime格式定義(兼容ISO C89)

代碼說明%Y4位數的年%y2位數的年%m2位數的月 [01,12]%d2位數的日 [01, 31]%H時(24小時制) [00, 23]%I時(12小時制) [01, 12]%M2位數的分[00, 59]%S秒[0,61] (秒60和61用於閏秒)%w用整數表示的星期幾 [0(星期天), 6]%U每年的第幾周[00, 53]。星期天被認為是每周的第一天,每年第一個星期天之前的那幾天被認為是"第0周"%W每年的第幾周[00, 53]。星期一被認為是每周的第一天,每年第一個星期一之前的那幾天被認為是"第0周"%z以+HHMM或-HHMM表示UTC的時區偏移量,如果時區為naive,則返回空字符串%F%Y-%m-%d 簡寫形式,例如 2020-05-25%D%m/%d/%y 簡寫形式,例如 05/25/20格式化編碼將字符串轉換為 datetimedatetime.strptime()
>>> value = '2020-05-20'
>>> datetime.strptime(value,'%Y-%m-%d')
datetime.datetime(2020, 5, 20, 0, 0)

dateutil.parser.parse

datetime.strptime()是通過已知格式進行日期解析的最佳方式。但是每次都要編寫格式定義是很麻煩的事情,尤其是對於一些常見的日期格式。這種情況下,你可以用dateutil這個第三方包中的parser.parse方法(pandas中已經自動安裝好了):

>>> from dateutil.parser import parse
>>> parse('2020-02-06')
datetime.datetime(2020, 2, 6, 0, 0)

dateutil可以解析幾乎所有人類能夠理解的日期表示形式

>>> parse('Jan 31, 1997 10:45 PM')
datetime.datetime(1997, 1, 31, 22, 45)

在國際通用的格式中,日出現在月的前面很普遍,傳入dayfirst=True即可解決這個 問題:

>>> a = parse('02/06/2020',dayfirst = True)
>>> print(a)
2020-06-02 00:00:00
>>> a = parse('02/06/2020')
>>> print(a)
2020-02-06 00:00:00

pandas.to_datetime() --轉換成DatetimeIndex

pandas通常是用於處理成組日期的,不管這些日期是DataFrame的軸索引還是列。to_datetime方法可以解析多種不同的日期表示形式。對標準日期格式(如ISO8601)的解析非常快:

>>> import pandas as pd
>>> datestrs = ['2011-07-06 12:00:00', '2011-08-06 00:00:00']
>>> pd.to_datetime(datestrs)
DatetimeIndex(['2011-07-06 12:00:00', '2011-08-06 00:00:00'], dtype='datetime64[ns]', freq=None)

它還可以處理缺失值(None、空字符串等)

>>> import numpy as np
>>> idx = datestrs + [np.nan]
>>> pd.to_datetime(idx)  # NaT(Not a Time)是pandas中時間戳數據的null值。
DatetimeIndex(['2011-07-06 12:00:00', '2011-08-06 00:00:00', 'NaT'], dtype='datetime64[ns]', freq=None)

注意:dateutil.parser是一個實用但不完美的工具。比如說,它會把一些原本不是日期的字符串認作是日期(比如"42"會被解析為2042年的今天)。

NaT(Not a Time)是pandas中時間戳數據的null值。

pandas Timestamp 轉 datetime

我們知道了利用str或datetime.strftime()方法(傳入一個格式化字符串),可將datetime對象和pandas的Timestamp對象可以被格式化為字符串。也知道了將字符串轉化為datetime對象。

在數據處理過程中,特別是在處理時間序列過程中,常常會出現pandas._libs.tslibs.timestamps.Timestamp格式的日期類型,這與我們所希望的datetime.datetime格式的日期格式不相同。

to_pydatetime()方法轉化轉換直接創建的pd.Timestamp對象
>>> ts = pd.Timestamp('2020-05-20 00:00:00', tz=None)
>>> type(ts)
pandas._libs.tslibs.timestamps.Timestamp
>>> ts.to_pydatetime()
datetime.datetime(2020, 5, 20, 0, 0)
>>> type(ts.to_pydatetime())
datetime.datetime

轉換由 pandas.to_datetime() 生成的 DatetimeIndex 的單個元素
>>> datestrs = ['2011-07-06 12:00:00'
                , '2011-08-06 00:00:00']
>>> pd.to_datetime(datestrs)
DatetimeIndex(['2011-07-06 12:00:00', '2011-08-06 00:00:00'], dtype='datetime64[ns]', freq=None)
>>> type(pd.to_datetime(datestrs))
pandas.core.indexes.datetimes.DatetimeIndex
# 取其中一個元素
>>> pd.to_datetime(datestrs)[0]
Timestamp('2011-07-06 12:00:00')
>>> type(pd.to_datetime(datestrs)[0])
pandas._libs.tslibs.timestamps.Timestamp

>>> ts = pd.to_datetime(datestrs)[0]
>>> ts.to_pydatetime()
datetime.datetime(2011, 7, 6, 12, 0)

直接將DatetimeIndex整體轉換
>>> rng = pd.date_range('20/05/2020'
                        , periods=3, freq='D')
>>> rng
DatetimeIndex(['2020-05-20', '2020-05-21', '2020-05-22']
              , dtype='datetime64[ns]', freq='D')
>>> rng.to_pydatetime()
array([datetime.datetime(2020, 5, 20, 0, 0),
       datetime.datetime(2020, 5, 21, 0, 0),
       datetime.datetime(2020, 5, 22, 0, 0)], dtype=object)

time 與日期互轉字符串轉time類型
>>> import time
>>> timestr = "2020-05-25"
>>> t = time.strptime(timestr, "%Y-%m-%d")
>>> t
time.struct_time(tm_year=2020, tm_mon=5, tm_mday=25, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=146, tm_isdst=-1)

>>> type(t)
time.struct_time

time類型與datetime類型的轉換

還是需要datetime模塊將其轉換為日期格式

>>> from datetime import datetime
>>> y,m,d = t[0:3]
>>> datetime(y,m,d)
datetime.datetime(2020, 5, 20, 0, 0)
>>> print(datetime(y,m,d))
2020-05-20 00:00:00

time類型轉字符串
>>> time.strftime("%Y-%m-%d %X", time.localtime())
'2020-5-20 20:05:20'

time格式定義

代碼說明%a星期幾的簡寫 Weekday name, abbr.%A星期幾的全稱 Weekday name, full%b月分的簡寫 Month name, abbr%B月份的全稱 Month name, full%c標準的日期的時間串 Complete date and time representation%d十進位表示的每月的第幾天 Day of the month%H24小時制的小時 Hour (24-hour clock)%I12小時制的小時 Hour (12-hour clock)%j十進位表示的每年的第幾天 Day of the year%m十進位表示的月份 Month number%M十時制表示的分鐘數 Minute number%S十進位的秒數 Second number%U第年的第幾周,把星期日做為第一天(值從0到53)Week number (Sunday first weekday)%w十進位表示的星期幾(值從0到6,星期天為0)weekday number%W每年的第幾周,把星期一做為第一天(值從0到53) Week number (Monday first weekday)%x標準的日期串 Complete date representation (e.g. 13/01/08)%X標準的時間串 Complete time representation (e.g. 17:02:10)%y不帶世紀的十進位年份(值從0到99)Year number within century%Y帶世紀部分的十制年份 Year number%z,%Z時區名稱,如果不能得到時區名稱則返回空字符。Name of time zone

pandas時間序列基礎

-- 數據STUDIO -- 

相關焦點

  • PHP時間戳和日期相互轉換操作
    在php中我們要把時間戳轉換日期可以直接使用date函數來實現,如果要把日期轉換成時間戳可以使用strtotime()函數實現,下面我來給大家舉例說明
  • Value屬性給單元格賦值(數字字符串日期時間等)
    需要Excel原始碼的網友請點擊關注和轉發,然後直接私信回覆:原始碼利用Value屬性給單元格賦值,有的Value屬性根據輸入的內容自判斷輸入的類型,比如數字、時間、日期、字符串等。'時間 #009 Range("A8").Value = CDate("11時12分12秒") '時間 #010 Range("A9").Value = "8888" '數字字符串
  • 3個函數,8個案例,玩轉時間合併、轉換、運算和提取
    大家好,上一篇文章分享了關於日期時間的提取函數和判定,講解了如何對日期是否是周末進行判定,今天繼續分享關於日期時間方面的合併、提取方面的剩餘內容,以及如何根據省份證號求算年齡,如何根據入職時間計算員工工齡兩個案例。那麼就讓我們開始吧!
  • Java之包裝類中基本數據類型與字符串類型之間的相互轉換
    Java基本數據類型的簡單介紹與字符串類型之間的相互轉換。基本類型與字符串類型之間的相互轉換:基本類型->字符串(String)1.基本類型的值+"",最簡單的方法,工作中常用2.包裝類的靜態方法toString(參數),不是Object類的toString()重載static
  • mysql UNIX時間戳與日期的相互轉換
    UNIX時間戳轉換為日期用函數: FROM_UNIXTIME() selectFROM_UNIXTIME(1156219870); 日期轉換為UNIX時間戳用函數: UNIX_TIMESTAMP()
  • Excel日期及時間函數——DATEVALUE函數
    DATEVALUE函數概念及語法DATEVALUE函數概念:將日期值從字符串轉化為序列數,表示日期時間代碼的日期;DATEVALUE 函數將存儲為文本的日期轉換為 Excel 識別為日期的序列號。 例如,公式=DATEVALUE("1/1/2008") 返回 39448,即日期 2008-1-1 的序列號。
  • Pandas 時間序列 - 縱覽與時間戳
    時間序列縱覽時間戳 vs.時間段轉換時間戳提供格式參數用多列組合日期時間無效數據紀元時間戳把時間戳轉換為紀元應用 `origin` 參數生成時間戳範圍自定義頻率範圍時間戳的界限依託 NumPy 的 datetime64、timedelta64 等數據類型,pandas 可以處理各種時間序列數據,還能調用 scikits.timeseries 等 Python 支持庫的時間序列功能。
  • 字符串比較和大小寫轉換
    */ packageunit;/** * @ClassName: StringCompareSample * @Description: 字符串(大小比較和字符大小寫轉換字符串的大小寫轉換在編寫程序時,有時需要進行字符串的大小寫轉換,將字符串中的字母全部轉換為大寫或小寫。
  • pandas日期(時間)處理總結--pandas日期和字符串之間的相互轉換,從日期欄位中提取年月日、時分秒、周數、季度等
    在做數據處理的過程,包括數據過濾、數據匯總計算等都會經常用到pandas從日期屬性中提取年月日。
  • Excel自動生成日期及格式設置、禁止輸入3-1轉日期、日期轉換文本
    在 Excel中,默認情況下,用拖拉的辦法不能自動生成日期,需要先寫一個函數再拖拉才能自動生成。除這種方法外,還可以用「序列」的辦法自動生成,並且一次可以生成一年甚至更長時間的日期。日期格式有許多種,有數字加短橫線的,也有數字加漢字的,還可以自定義。
  • MATLAB時間與日期的基本操作
    7.2 日期和時間元素本小節將為讀者介紹如何對指定日期和時間元素的數值進行提取,另外如何通過datetime的屬性來對指定的元素進行賦值。isduration判斷是否是duration數組dateshift平移日期或者產生日期和時間序列
  • Python 日期和時間
    Python 日期和時間Python 提供了一個 time 和 calendar 模塊可以用于格式化日期和時間。
  • 黑馬程式設計師:Python編程之時間和日期模塊
    工作當中經常會遇到時間或者日期的計算和格式轉換,因此時間模塊就顯得非常重要,Python內置提供了 time和 datetime和 calendar模塊用來格式化日期和時間.time模塊Python中時間可以概括為三種類型:float浮點數,即時間戳struct tuple 時間元組str字符串,規定格式表示時間戳介紹每個時間戳都以自從1970年1月1日午夜(曆元)到當前經過了多長時間來表示,時間間隔是以秒為單位的浮點小數.
  • 最好用的 6 款 Python 的日期時間庫
    除了將字符串轉換為更有用的 Python 對象之外,還有許多庫具有一些有用的方法和工具,可以讓你更輕鬆地進行時間測試、將時間轉換為不同的時區、以人類可讀的格式輸出時間信息,本文將介紹以下六個Python的時間日期庫:● Dateutil● Arrow● Moment● Maya● Delorean● Freezegun
  • Python的神奇魔法:鞏固熟練運用字符串拼接序列類型轉化格式化
    Python我們既然學習了字符串(str)的拼接,序列類型的相互轉化,以及格式化化輸出的內容。今天我們來一起研究一下如何熟練運用,怎麼將需求完美展現。開發工具:IDLE (Python 3.7 64-bit) 註:不需要和小編一樣的版本,只要是Python3的版本就可以,語法方面沒有什麼不同的。
  • Python:字符串
    一:字符串(str)    字符串(str)也是Python序列的一種,是Python中非常常見的一種數據類型,通過使用一對單引號 '  ' 或是一對雙引號 "  " 來生成字符串內容,當然有時候你也會看到三對單引號或雙引號,這也是合法的。
  • R語言 日期、時間和lubridate包
    函數strptime( )是string parse time的簡稱,返回POSIXlt日期(即以列表的形式存儲日期和時間),在解析時必須制定文本和日期對應的位置,日期的格式使用%+字母來指定。) chr [1:2] "2018-02-15" "2019-03-15"3):由於POSIXct類是以秒為單位來計算時間,Date類是以天為單位類計算時間日期和POSIXct都是通過轉換為天數或秒數的數值所以可以把他們當做數值進行加減一種方式是兩個日期值相互加減,第二種方式是日期值加減一個數值,Date類和POSIXct類不同混合加減兩者的數值代表不同的含義
  • Python datetime指南:教你如何處理日期和時間(附試題+答案)
    ,它提供了 4 種對日期和時間進行處理的主要對象:datetime、date、time 和 timedelta。通過本文,你會學習到如何操作這些對象,並用 Python 解決一些有關日期和時間的實際問題。
  • 後端編程Python3-字符串類型(上)
    str()函數也可以用作一個轉換函數,此時要求第一個參數為字符串或可以轉換為字符串的其他數據類型,其後跟隨至多兩個可選的字符串參數,其中一個用於指定要使用的編碼格式,另一個用於指定如何處理編碼錯誤。前面我們注意到,字符串是使用引號創建的,可以使用單引號,也可以使用雙引號,但是字符串兩端必須相同。
  • Python中的時間序列處理 中篇
    最基本的日期/時間對象是 Timestamp 和 DatetimeIndex 對象。雖然這些類對象可以直接調用,但更常見的方法是使用 pd.to_datetime() 函數,它可以解析各種各樣的日期與時間格式。