我想将以下一系列UNIX纪元转换为常规日期时间对象:
>> val = pd.Series(["1440643875", "1440644191", "1440645638", "1440998720"])
>> val
0 1440643875
1 1440644191
2 1440645638
3 1440998720
Name: obj, dtype: object
似乎有两种方法可以做到这一点。第一个是:
>> pd.to_datetime(val, unit='s')
ValueError: year is out of range
第二个:
val.astype("datetime64[s]")
TypeError: Cannot parse "1445124547" as unit 's' using casting rule 'same_kind'
这里似乎有什么问题?
我还尝试使用"在线纪元计算器"检查这些时间戳。工具,他们给出了合理的答案..
答案 0 :(得分:7)
问题在于元素是字符串,而不是整数。显然,pd.to_datetime()
并不足以将字符串转换为日期时间。
我的解决方案是:
>> val.astype('int').astype("datetime64[s]")
0 2015-08-27 02:51:15
1 2015-08-27 02:56:31
2 2015-08-27 03:20:38
3 2015-08-31 05:25:20
dtype: datetime64[ns]
答案 1 :(得分:0)
<强> EDITED 强>
datetime.datetime.utcfromtimestamp
只能获得整数作为参数:
In [510]: datetime.datetime.utcfromtimestamp('1440643875')
TypeError: an integer is required (got type str)
首先,您需要将Series转换为int,然后才能使用这些方法:
import pandas as pd
import datetime
s = pd.Series(["1440643875", "1440644191", "1440645638", "1440998720"], dtype=object)
s = pd.to_numeric(s)
In [50]: s
Out[50]:
0 1440643875
1 1440644191
2 1440645638
3 1440998720
dtype: int64
In [51]: pd.to_datetime(s, unit='s')
Out[51]:
0 2015-08-27 02:51:15
1 2015-08-27 02:56:31
2 2015-08-27 03:20:38
3 2015-08-31 05:25:20
dtype: datetime64[ns]
同样datetime.datetime.utcfromtimestamp
正如@Adam Smith在评论中指出的那样:
In [52]: s.apply(datetime.datetime.utcfromtimestamp)
Out[52]:
0 2015-08-27 02:51:15
1 2015-08-27 02:56:31
2 2015-08-27 03:20:38
3 2015-08-31 05:25:20
dtype: datetime64[ns]
答案 2 :(得分:0)
我们可以直接将纪元时间转换为日期时间。默认情况下,使用pd.to_datetime将采用%Y-%m-%d%I:%M:%S格式。通过使用dt.strftime,可以将完整列格式化为所需格式。
from datetime import datetime as dt
import pandas as pd
input_data_df['timestamp']=pd.to_datetime(input_data_df['epoch'],unit='ms')
input_data_df['timestamp'] = input_data_df['timestamp'].dt.strftime('%d-%m-%Y %I:%M:%S')