Python 将18位LDAP/FILETIME时间戳转换为人类可读的日期

Python 将18位LDAP/FILETIME时间戳转换为人类可读的日期,python,datetime,Python,Datetime,我已经从广告中导出了一个广告用户列表,需要验证他们的登录时间 powershell脚本的输出为lastlogin提供LDAP/文件时间 示例130305048577611542 我很难将它转换成熊猫的可读时间 Im使用以下代码: df['dateoflogin']=pd.to_datetime(df['FileTime'],unit='ns') FileTime列包含的时间格式与上面的示例类似 我在我的新列date of login中得到以下输出 示例1974-02-17 03:50:48.57

我已经从广告中导出了一个广告用户列表,需要验证他们的登录时间

powershell脚本的输出为lastlogin提供LDAP/文件时间

示例130305048577611542

我很难将它转换成熊猫的可读时间

Im使用以下代码:

df['dateoflogin']=pd.to_datetime(df['FileTime'],unit='ns')

FileTime列包含的时间格式与上面的示例类似

我在我的新列date of login中得到以下输出

示例1974-02-17 03:50:48.577611542

我知道这被错误地解析了,因为当我在在线转换器上输入这个日期时间时,我得到了这个输出

示例:

Epoch/Unix时间:1386031258 格林尼治时间:2013年12月3日星期二上午12:40:58 您的时区:2013年12月2日星期一下午4:40:58 GMT-08:00


有人知道这里发生了什么吗?为什么我所有的约会都是在1970年?

我知道这个答案对于聚会来说已经很晚了,但是对于其他展望未来的人来说

18位Active Directory时间戳(LDAP),也称为“Windows NT时间格式”、“Win32 FILETIME或SYSTEMTIME”或NTFS文件时间。这些在Microsoft Active Directory中用于pwdLastSet、accountExpires、LastLogon、LastLogonTimestamp和LastPwdSet。时间戳是自UTC 1601年1月1日起的100纳秒间隔数(1纳秒=十亿分之一秒)

因此,130305048577611542确实与2013年12月3日有关

在Python中通过日期时间函数输入该值时,它将该值截断为九位数字。因此,时间戳变为130305048,从1970年1月1日开始,这确实导致1974年的日期

为了获得正确的Unix时间戳,您需要执行以下操作:


(130305048577611542/10000000)-116444473600

我知道这个答案对于党来说已经很晚了,但是对于任何一个展望未来的人来说

18位Active Directory时间戳(LDAP),也称为“Windows NT时间格式”、“Win32 FILETIME或SYSTEMTIME”或NTFS文件时间。这些在Microsoft Active Directory中用于pwdLastSet、accountExpires、LastLogon、LastLogonTimestamp和LastPwdSet。时间戳是自UTC 1601年1月1日起的100纳秒间隔数(1纳秒=十亿分之一秒)

因此,130305048577611542确实与2013年12月3日有关

在Python中通过日期时间函数输入该值时,它将该值截断为九位数字。因此,时间戳变为130305048,从1970年1月1日开始,这确实导致1974年的日期

为了获得正确的Unix时间戳,您需要执行以下操作:


(130305048577611542/10000000)-116444473600

import datetime

def ad_timestamp(timestamp):
    if timestamp != 0:
        return datetime.datetime(1601, 1, 1) + datetime.timedelta(seconds=timestamp/10000000)
    return np.nan
因此,如果需要转换列,请执行以下操作:

df.lastLogonTimestamp = df.lastLogonTimestamp.fillna(0).apply(ad_timestamp)

注意:在使用
apply
之前,我需要使用
fillna
。另外,由于我填充了0,我在转换函数中检查了关于,
if timestamp!=0
。希望这是有道理的。这是额外的东西,但您可能需要它来转换有问题的列。

下面是我在Python中使用的一个解决方案,它对我很有效:

import datetime

def ad_timestamp(timestamp):
    if timestamp != 0:
        return datetime.datetime(1601, 1, 1) + datetime.timedelta(seconds=timestamp/10000000)
    return np.nan
因此,如果需要转换列,请执行以下操作:

df.lastLogonTimestamp = df.lastLogonTimestamp.fillna(0).apply(ad_timestamp)

注意:在使用
apply
之前,我需要使用
fillna
。另外,由于我填充了0,我在转换函数中检查了关于,
if timestamp!=0
。希望这是有道理的。这是额外的东西,但是你可能需要它来转换有问题的专栏。

我已经在这上面呆了好几天了。但现在我准备以更易于使用的形式分享真正可行的解决方案:

import datetime
timestamp = 132375402928051110
value = datetime.datetime (1601, 1, 1) +   
datetime.timedelta(seconds=timestamp/10000000) ### combine str 3 and 4  
print(value.strftime('%Y-%m-%d %H:%M:%S'))

这件事我已经坚持了好几天了。但现在我准备以更易于使用的形式分享真正可行的解决方案:

import datetime
timestamp = 132375402928051110
value = datetime.datetime (1601, 1, 1) +   
datetime.timedelta(seconds=timestamp/10000000) ### combine str 3 and 4  
print(value.strftime('%Y-%m-%d %H:%M:%S'))

我认为这是一份可能的复印件,我想它可能是复印件的复制品。