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条经验 获得超12个赞
虽然有一个公认的有效答案,但我敢于提出另一种解决方案,它可能更直观且不易出错,因为它不依赖于特定的参考值。这种方法也可以推广到所有情况。
解决方案的背景
问题中的时间值是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
添加回答
举报