多列转换为单个datetime数据框列

时间:2020-04-23 23:24:27

标签: python pandas

我有一个数据框,其中包含(其中包括)一天中的时间(00:00-23:59:59),一天(1-7),月份(1-12)和年份(2000- 2019)。如何将每一列的值逐行合并到新的DateTime对象中,然后将这些新的日期时间存储在新的列中?我已经阅读了有关此任务的其他文章,但它们似乎都涉及到一个date列到一个DateTime列,而我有4列需要转换为DateTime。任何帮助表示赞赏!

例如

| 4:30:59 | 1 | 1 | 2000 | TO 200/1/1 4:30:59

这是我到目前为止唯一没有执行任何操作的代码

#creating datetime object (MISC)
data = pd.read_csv('road_accidents_data_clean.csv',delimiter=',')
df = pd.DataFrame(data)
format = '%Y-%m-%d %H:%M:%S'
n = 0
df['datetime'] = data.loc[n,'Crash_Day'],data.loc[n,'Crash_Month'],data.loc[n,'Year']

我的DataFrame的布局如下:

Index | Age | Year | Crash_Month | Crash_Day | Crash_Time | Road_User | Gender | 
  0      37   2000         1            1        4:30:59     DRIVER      MALE
  1      42   2000         1            1        7:45:10     DRIVER      MALE
  2      25   2000         1            1        10:15:30   PEDESTRIAN  FEMALE

Crash_Type | Injury_Severity | Crash_LGA | Crash_Area_Type | Datetime |
  UNKNOWN          1              YARRA      MELBOURNE          NaN
 OVERTAKING        1              YARRA      MELBOURNE          NaN
ADJACENT DIR       0              MONASH     MELBOURNE          NaN

注意:数据框的宽度为13列,我无法将它们全部都放在一行上,因此Crash_Type从性别右侧开始。

下面是我建议使用的代码/我对其进行了修改

df = pd.DataFrame(dict(
    Crash_Time=['4:30:59','4:20:00'],
    Crash_Day=[1,20],
    Crash_Month=[1,4],
    Year=[2000,2020],

))


data['Datetime'] = df['Datetime']=pd.to_datetime(
    np.sum([
        df['Year'].astype(str),
        '-',
        df['Crash_Month'].astype(str),
        '-',
        df['Crash_Day'].astype(str),
        ' ',
        df['Crash_Time'],
    ]),
    format = '%Y-%m-%d %H:%M:%S',
)

我已经修改了这段代码,以便将datetime列的值与我​​的原始数据框组合在一起。

1 个答案:

答案 0 :(得分:1)

使用+将列组合为一系列series(通过使用str方法将其转换为pandas.Series.astype),然后在分配新序列之前将其传递给pd.to_datetime到df中的新列:

import pandas as pd

df = pd.DataFrame(dict(time=['4:30:59'],date=[1],month=[1],year=[2000]))

df['datetime'] = pd.to_datetime(
    df['year'].astype(str)+'-'+df['month'].astype(str)+'-'+df['date'].astype(str)+' '+df['time'],
    format = '%Y-%m-%d %H:%M:%S',
)
print(df)

example in python tutor

编辑:您还可以使用numpy.sum来使那条较长的线将列加在一起在眼睛上更容易:

import pandas as pd
import numpy as np

df = pd.DataFrame(dict(
    time=['4:30:59','4:20:00'],
    date=[1,20],
    month=[1,4],
    year=[2000,2020],

))

df['datetime']=pd.to_datetime(
    np.sum([
        df['year'].astype(str),
        '-',
        df['month'].astype(str),
        '-',
        df['date'].astype(str),
        ' ',
        df['time'],
    ]),
    format = '%Y-%m-%d %H:%M:%S',
)

sum example in python tutor

编辑2:使用您实际的列名,应该是这样的:

import pandas as pd
import numpy as np
'''
Index | Age | Year | Crash_Month | Crash_Day | Crash_Time | Road_User | Gender | 
  0      37   2000         1            1        4:30:59     DRIVER      MALE

Crash_Type | Injury_Severity | Crash_LGA | Crash_Area_Type | Datetime |
  UNKNOWN          1              YARRA      MELBOURNE          NaN
'''
df = pd.DataFrame(dict(
    Crash_Time=['4:30:59','4:20:00'],
    Crash_Day=[1,20],
    Crash_Month=[1,4],
    Year=[2000,2020],

))

df['Datetime']=pd.to_datetime(
    np.sum([
        df['Year'].astype(str),
        '-',
        df['Crash_Month'].astype(str),
        '-',
        df['Crash_Day'].astype(str),
        ' ',
        df['Crash_Time'],
    ]),
    format = '%Y-%m-%d %H:%M:%S',
)
print(df)

another python tutor link

要注意的一件事是,您可能要仔细检查csv文件是否仅由逗号分隔,或者是逗号和空格?如果除逗号之外还有多余的空格分隔数据,则可能需要用df = pd.read_csv('road_accidents_data_clean.csv',sep=', ')加载数据。您不想在数据中拥有多余的空间。