在Pandas中将Unix纪元时间转换为日期时间

sma*_*d__ 3 python excel matplotlib pandas

我一直在寻找很长时间来找到解决我的问题的方法。

我使用以下代码从想要的列中获取数据

import pandas as pd
df = pd.read_excel("Live_data_test.xlsx","Sheet1")

number_of_entries = len(df.loc[:, 'Time'])
number_of_entries_last_3 = number_of_entries - 3
unix_x1 = df.loc[number_of_entries_last_:number_of_entries, 'Time']
print(unix_x1)
Run Code Online (Sandbox Code Playgroud)

我得到了输出

10    1.513753e+09
11    1.513753e+09
12    1.513753e+09
Name: Time, dtype: float64
Run Code Online (Sandbox Code Playgroud)

我想将此时间转换为可读时间,以便将其输入到matplotlib图的x轴中。

real_x1 = datetime.datetime.strptime(str(unix_x1), '%Y-%m-%d %H:%M:%S')
Run Code Online (Sandbox Code Playgroud)

我得到错误

ValueError: time data '10    1.513753e+09\n11    1.513753e+09\n12    1.513753e+09\nName: Time, dtype: float64' does not match format '%Y-%m-%d %H:%M:%S'
Run Code Online (Sandbox Code Playgroud)

我如何获得这个unix时间来输出为用户可读的格式?

我对代码有点陌生,所以如果您回答,是否可以解释原因?

Vai*_*ali 8

熊猫可以读取Unix纪元时间,使用单位参数

pd.to_datetime('1.513753e+09', unit = 's')

Timestamp('2017-12-20 06:56:40')
Run Code Online (Sandbox Code Playgroud)

您可以使用

pd.to_datetime(df[<your_datetime_column>], unit = 's')
Run Code Online (Sandbox Code Playgroud)

  • 严重低估的答案。应该有绿色支票 (4认同)

Eng*_*ero 3

您的问题与将您读取的值(看起来像 Unix 纪元后的秒数,即 1970 年 1 月 1 日)转换为datetime对象有关。您收到的错误是因为您的时间只是一个浮点数,但这不是您尝试处理它们的方式。

假设这些是 Unix 纪元之后的秒数,您需要使用timedelta定义为 Unix 纪元的起点来创建日期时间:

from datetime import datetime, timedelta
start = datetime(1970, 1, 1)  # Unix epoch start time
df['datetime'] = df.Time.apply(lambda x: start + timedelta(seconds=x))
Run Code Online (Sandbox Code Playgroud)

最后一行在数据框中创建一个名为 的新列'datetime',并通过读取'Time'as 中的列来填充它x,并计算 Unix 纪元之后的时间x秒数。

注意:如果您想将这些datetime对象转换为您指定的时间字符串,我们可以通过使用以下命令创建一个新列来完成此操作strftime()

df['string_time'] = df.datetime.apply(lambda x: x.strftime('%Y-%m-%d %H:%M:%S'))
Run Code Online (Sandbox Code Playgroud)