我有一个数据框,其中包含(其中包括)一天中的时间(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列的值与我的原始数据框组合在一起。
答案 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)
编辑:您还可以使用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',
)
编辑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)
要注意的一件事是,您可能要仔细检查csv文件是否仅由逗号分隔,或者是逗号和空格?如果除逗号之外还有多余的空格分隔数据,则可能需要用df = pd.read_csv('road_accidents_data_clean.csv',sep=', ')
加载数据。您不想在数据中拥有多余的空间。