2 回答

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]

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
添加回答
舉報