亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將午夜 01/01/0001 的紀元轉換為熊貓中的 DateTime

將午夜 01/01/0001 的紀元轉換為熊貓中的 DateTime

藍山帝景 2023-03-22 16:35:54
我有一列包含一系列時間戳的列。最初我認為它們在 Unix 時間戳系統中,所以我使用以下代碼將它們轉換為日期時間。big_frame['date'] = pd.to_datetime(big_frame['filename'],unit='s')但是,它給了我奇怪的結果,所以我進行了更多研究,發現時間戳基本上使用的是 .net 紀元,即 01/01/0001 午夜。所以文件名是從那個紀元開始的秒數。如何將數據框中的列轉換為正確的日期時間?例如,如果我有這個63730342900 結果應該是14/07/2020 17:01:40編輯:https://www.epochconverter.com/seconds-days-since-y0這是我能找到的唯一可以正確轉換上述時間戳的網站下面是我要轉換的列0     637290451451     637290451452     637290451463     637290451464     637290451465     637290451476     637290451477     63729045147
查看完整描述

2 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

01/01/0001似乎超出了 datetime/timedelta 類型的范圍。我們可以像這樣做一些 hack:


ref_date = pd.to_datetime('14/07/2020 17:01:40')

ref_stamp = 63730342900



bigframe['date'] = pd.to_timedelta(big_frame['date'] - ref_stamp, unit='s') + ref_date

輸出:


0   2020-06-29 16:32:25

1   2020-06-29 16:32:25

2   2020-06-29 16:32:26

3   2020-06-29 16:32:26

4   2020-06-29 16:32:26

5   2020-06-29 16:32:27

6   2020-06-29 16:32:27

7   2020-06-29 16:32:27

Name: date, dtype: datetime64[ns]


查看完整回答
反對 回復 2023-03-22
?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

雖然有一個公認的有效答案,但我敢于提出另一種解決方案,它可能更直觀且不易出錯,因為它不依賴于特定的參考值。這種方法也可以推廣到所有情況。

解決方案的背景

問題中的時間值是DateTime.MinValue.NET 紀元的秒數,相當于 00:00:00.0000000 UTC,0001 年 1 月 1 日。幸運的是,Python 也有 ,datetime.min這是最早可表示的datetime,與最小的 .NET 紀元相同.

>>> datetime.datetime.min

Out: datetime.datetime(1, 1, 1, 0, 0)


>>> datetime.datetime.min.strftime("%d/%m/%Y %H:%M:%S")

Out: 01/01/1 00:00:00

解決方案

現在我們可以將 .NET 紀元作為基線使用datetime.min并添加秒數。我們還可以指定所需的輸出格式。


import datetime

(datetime.datetime.min + datetime.timedelta(seconds=63730342900)).strftime("%d/%m/%Y %H:%M:%S")

這給了我們正確的


14/07/2020 17:01:40

DataFrame讓我們擴展解決方案以涵蓋問題中的熊貓。


import pandas as pd

import datetime

# Create the dataframe as in the question

df = pd.DataFrame([63730342900, 63729045145,

? ? ? ? ? ? ? ? ? ?63729045145, 63729045146,?

? ? ? ? ? ? ? ? ? ?63729045146, 63729045146,?

? ? ? ? ? ? ? ? ? ?63729045147, 63729045147,?

? ? ? ? ? ? ? ? ? ?63729045147], columns = ["datetime"])

# Apply the previous formula to every cell in the column using a lambda function

df["datetime"] = df["datetime"].apply(lambda seconds: (datetime.datetime.min + datetime.timedelta(seconds=seconds)).strftime("%d/%m/%Y %H:%M:%S"))

結果是一個格式良好的數據框


? ? datetime

0? ?14/07/2020 17:01:40

1? ?29/06/2020 16:32:25

2? ?29/06/2020 16:32:25

3? ?29/06/2020 16:32:26

4? ?29/06/2020 16:32:26

5? ?29/06/2020 16:32:26

6? ?29/06/2020 16:32:27

7? ?29/06/2020 16:32:27

8? ?29/06/2020 16:32:27


查看完整回答
反對 回復 2023-03-22
  • 2 回答
  • 0 關注
  • 116 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號