我有一個帶有字串格式sav的日期時間列的檔案。%m/%d/%Y當我閱讀它時pd.read_spss(),它似乎沒有任何與日期時間相關的引數,它最終看起來像 unix 時間,除了時間將是幾個世紀后的唯一值,包括13778726400,13841884800等。
但是,當我將 read 列輸入pd.to_datetime時,它并沒有被解釋為我期望的日期,而是 1970 年原始 unix 日期之后的幾秒鐘:
pd.to_datetime(df.col)
0 1970-01-01 00:00:13.778726400
1 1970-01-01 00:00:13.841798400
2 1970-01-01 00:00:13.778726400
3 1970-01-01 00:00:13.778035200
4 1970-01-01 00:00:13.841798400
為什么 datetime 列以這種奇怪的格式被讀取,為什么pd.to_datetime不能將其轉換回來?
(我目前的解決方法是在 SPSS 中手動將日期列設定為字串。然后pyreadstat/pandas.read_spss將其作為字串讀取并pandas.to_dateime可以轉換沒有問題。)
uj5u.com熱心網友回復:
日期、時間和日期時間總是以數字形式存盤在 SPSS 中,然后您添加一種格式進行顯示。SPSS 不斷添加新格式,同時洗掉其他格式。新格式必須手動添加到 pyreadstat 代碼中,而舊格式保留在代碼中以實作向后兼容性。所以問題是你發現了一個新的日期/日期時間/時間格式,它沒有在 pyreadstat 中注冊。
另一種解決方法是在 SPSS 中打開檔案并將其存盤為日期/日期時間/時間,但 pyreadstat 可以識別不同的格式,例如 DATE11、DATETIME20 等(pyreadstat 接受的當前串列是 [https:// github.com/Roche/pyreadstat/blob/master/pyreadstat/_readstat_parser.pyx#L52-L54])
最好的辦法是提交一個 github 問題,描述找到的要添加的新格式。我剛剛添加了一些我在最新的 SPSS檔案中找到的內容,希望您的問題應該在下一個版本中得到解決(已經在開發人員上可用)。如果沒有,請提交帶有可重現示例的問題。
SPSS 用于存盤日期的數字不是 unix 時間,而是自 1582-10-14(公歷開始)以來的秒數(在日期時間或時間的情況下)或天數(在日期的情況下). 所以你需要這樣的東西來手動計算它:
from datetime import datetime, date, timedelta
origin = date(1582, 10, 14)
myspssvalue = 13778726400
delta = timedelta(seconds=myspssvalue) # or days=myspssvalue if date
python_date = origin delta
print(python_date)
#datetime.date(2019, 6, 1)
此外,如果您假設這個數字是自 1970 年以來的秒數:
>>> datetime.fromtimestamp(13778726400)
datetime.datetime(2406, 8, 19, 2, 0)
pandas 正在做的是認為你給出的數字是自 1970-01-01 以來的納秒數(它將它轉換為 datetime64[ns]),這就是為什么你得到一個非常接近 1970 的日期
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/445170.html
下一篇:字串中的模式匹配
