将午夜 01/01/0001 的纪元转换为熊猫中的 DateTime

我有一列包含一系列时间戳的列。最初我认为它们在 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     63729045145

1     63729045145

2     63729045146

3     63729045146

4     63729045146

5     63729045147

6     63729045147

7     63729045147


蓝山帝景
浏览 89回答 2
2回答

慕的地8271018

01/01/0001似乎超出了 datetime/timedelta 类型的范围。我们可以像这样做一些 hack:ref_date = pd.to_datetime('14/07/2020 17:01:40')ref_stamp = 63730342900bigframe['date'] = pd.to_timedelta(big_frame['date'] - ref_stamp, unit='s') + ref_date输出:0   2020-06-29 16:32:251   2020-06-29 16:32:252   2020-06-29 16:32:263   2020-06-29 16:32:264   2020-06-29 16:32:265   2020-06-29 16:32:276   2020-06-29 16:32:277   2020-06-29 16:32:27Name: date, dtype: datetime64[ns]

开满天机

虽然有一个公认的有效答案,但我敢于提出另一种解决方案,它可能更直观且不易出错,因为它不依赖于特定的参考值。这种方法也可以推广到所有情况。解决方案的背景问题中的时间值是DateTime.MinValue.NET 纪元的秒数,相当于 00:00:00.0000000 UTC,0001 年 1 月 1 日。幸运的是,Python 也有 ,datetime.min这是最早可表示的datetime,与最小的 .NET 纪元相同.>>> datetime.datetime.minOut: 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:40DataFrame让我们扩展解决方案以涵盖问题中的熊猫。import pandas as pdimport datetime# Create the dataframe as in the questiondf = 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 functiondf["datetime"] = df["datetime"].apply(lambda seconds: (datetime.datetime.min + datetime.timedelta(seconds=seconds)).strftime("%d/%m/%Y %H:%M:%S"))结果是一个格式良好的数据框    datetime0   14/07/2020 17:01:401   29/06/2020 16:32:252   29/06/2020 16:32:253   29/06/2020 16:32:264   29/06/2020 16:32:265   29/06/2020 16:32:266   29/06/2020 16:32:277   29/06/2020 16:32:278   29/06/2020 16:32:27
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python