pandas:从时间戳中提取日期和时间

时间:2016-09-23 13:33:55

标签: python python-2.7 pandas time-series

我有一个timestamp列,其中时间戳采用以下格式

2016-06-16T21:35:17.098+01:00

我想从中提取日期和时间。我做了以下事情:

import datetime as dt

df['timestamp'] = df['timestamp'].apply(lambda x : pd.to_datetime(str(x)))

df['dates'] = df['timestamp'].dt.date

这工作了一段时间。但突然之间却没有。

如果我再次df['dates'] = df['timestamp'].dt.date我收到以下错误

Can only use .dt accessor with datetimelike values

幸运的是,我已在csv中使用dates保存了数据框,但我现在想要以time

格式创建另一列23:00:00.051

修改

从原始数据文件(1500万个样本)中,timestamp列如下所示(前5个样本):

            timestamp

0           2016-06-13T00:00:00.051+01:00
1           2016-06-13T00:00:00.718+01:00
2           2016-06-13T00:00:00.985+01:00
3           2016-06-13T00:00:02.431+01:00
4           2016-06-13T00:00:02.737+01:00

执行以下命令后

df['timestamp'] = df['timestamp'].apply(lambda x : pd.to_datetime(str(x)))

timestamp列与dtype类似,为dtype:datetime64 [ns]

0    2016-06-12 23:00:00.051
1    2016-06-12 23:00:00.718
2    2016-06-12 23:00:00.985
3    2016-06-12 23:00:02.431
4    2016-06-12 23:00:02.737

然后终于

df['dates'] = df['timestamp'].dt.date

0           2016-06-12
1           2016-06-12
2           2016-06-12
3           2016-06-12
4           2016-06-12

编辑2

发现错误。我已经清理了数据并将数据框保存在csv文件中,因此我不必再次进行清理。当我读取csv时,时间戳dtype更改为object。现在我该如何解决这个问题?

3 个答案:

答案 0 :(得分:5)

导入日期时间

如果日期是字符串形式,那么

df['DateTime'] = [datetime.datetime.strptime(d, "%Y-%m-%d %H:%M") for d in 
df["DateTime"]]# this line converts the string object in Timestamp object
df['Date'] = [datetime.datetime.date(d) for d in df['DateTime']]# extracting date from timestamp
df['Time'] = [datetime.datetime.time(d) for d in df['DateTime']]# extracting time from timestamp

如果对象已经是时间戳格式而不是跳过第一行代码。

“%Y-%m-%d%H:%M”这表示您的时间戳对象必须采用“2016-05-16 12:35:00”之类的形式。

答案 1 :(得分:2)

首先执行此操作:

Option Explicit
Public Sub test()
    Dim lRow As Long
    With ActiveSheet
        .AutoFilterMode = False
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        With .Range("A1:Y" & lRow)
            .AutoFilter Field:=3, Criteria1:="<>CY*"
            On Error Resume Next
            .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).SpecialCells(xlCellTypeVisible).EntireRow.Delete
            On Error GoTo 0
        End With
     .AutoFilterMode = False
    End With      
End Sub

在您像往常一样进行提取之前:

df['time'] = pd.to_datetime(df['timestamp'])

答案 2 :(得分:0)

导入 csv 时,请使用 parse_datespandas.read_csv() 参数。例如,要将列 utc_datetime 导入为日期时间:

parse_dates = ['utc_datetime']
df = pandas.read_csv('file.csv', parse_dates=parse_dates)

要从时间戳中提取日期,请使用 numpy 而不是 Pandas:

df['utc_date'] = numpy.array(df['utc_datetime'].values, dtype='datetime64[D]')

Numpy 日期时间操作明显快于 Pandas 日期时间操作。