为了账号安全,请及时绑定邮箱和手机立即绑定

将午夜 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条经验 获得超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


查看完整回答
反对 回复 2023-03-22
  • 2 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信