我已经从AD中导出了AD用户列表,需要验证其登录时间。
powershell脚本的输出将lastlogin作为LDAP / FILE时间显示
示例130305048577611542
我无法将其转换为熊猫可读的时间
我使用以下代码:
df ['登录日期'] = pd.to_datetime(df ['FileTime'],unit ='ns')
FileTime列包含的时间格式类似于上面的示例。
我在登录的新列日期中得到以下输出
示例1974-02-17 03:50:48.577611542
我知道这是错误地解析的,因为当我在在线转换器上输入此日期时间时,会得到此输出
示例:
Epoch / Unix时间:1386031258 GMT:2013年12月3日,星期二,12:40:58 AM 您的时区:2013年12月2日,星期一,格林尼治标准时间-08:00,下午4:40:58
任何人都知道这里发生了什么,为什么我所有的约会都在1970'
答案 0 :(得分:1)
我知道这个答案对这个聚会来说很晚了,但是对于将来有其他希望的人来说。
18位Active Directory时间戳(LDAP),也称为“ Windows NT时间格式”,“ Win32 FILETIME或SYSTEMTIME”或NTFS文件时间。这些在Microsoft Active Directory中用于pwdLastSet,accountExpires,LastLogon,LastLogonTimestamp和LastPwdSet。时间戳记是自1601年UTC以来的100纳秒间隔(1纳秒=十亿分之一秒)的数量。
因此,130305048577611542确实与2013年12月3日有关。
在Python中通过日期时间函数将此值放入时,会将其截断为9位数字。因此,时间戳记变为130305048,并且从1970年1月1日开始,这确实导致1974年的日期!
为了获得正确的Unix时间戳,您需要执行以下操作:
(130305048577611542/10000000)-11644473600
答案 1 :(得分: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
因此,如果您需要转换Pandas列:
df.lastLogonTimestamp = df.lastLogonTimestamp.fillna(0).apply(ad_timestamp)
注意:我需要先使用fillna
,然后再使用apply
。另外,由于我填充了0,因此我在转换函数if timestamp != 0
中进行了检查。希望有道理。这是多余的东西,但您可能需要用它来转换有关的列。
答案 2 :(得分: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'))