python - 如何使用 Pandas 处理来自 CSV 的不规则格式
问题描述
我一直在尝试不同的方法来处理来自 CSV 的 Pandas 中的日期时间。
我在 csv 文件中有 3 列:
- 开球日期
- 开球时间
- 时间
前两列格式正确。但是第三列“时间”的格式混淆了。有些表示为时间,有些表示为日期时间。
例如:
12:00:00 AM
1/1/1900 9:04:00 PM
如何使用熊猫制作相同的格式?
第二件事是我想添加所有三列以获得事件时间。
例如:
kickoffDate =['8/6/2017','8/6/2017','8/6/2017']
kickoffTime =['15:00:00','15:00:00','15:00:00']
time =['51:48:00','86:05:00','10:04']`
在这种情况下,时间是mm:ss:00
格式。我想结合这三列来创建一个新列,即eventdatetime
:
eventdatetime = [06-08-2017 15:51:48, 06-08-2017 16:26:05,06-08-2017 15:10:04]`
我怎样才能做到这一点?我可以使用以下公式将前两者结合起来:
DateTime1 = data['kickoffDate']+' '+ data ['kickoffTime']
原始 csv 文件可从以下链接下载:
https://drive.google.com/open?id=1JL65x7nq2m6zk4qnaRUDKL894aEdXW_B
解决方案
您可以将参数parse_dates
与第一列和第二列一起使用datetimes
,然后转换最后一列to_timedelta
,并为没有任何值的值添加00:
小时数:
:
df = pd.read_csv('Datetimetest.csv', parse_dates=[[0, 1]])
m = df['time'].str.count(':') != 1
df['time'] = pd.to_timedelta('00:' + df['time'].mask(m, df['time'].str.replace(':00$', '')))
df['eventdatetime'] = df['kickoffDate_kickoffTime'] + df['time']
print (df.head())
kickoffDate_kickoffTime time eventdatetime
0 2018-04-30 19:00:00 00:47:36 2018-04-30 19:47:36
1 2018-04-30 19:00:00 00:15:28 2018-04-30 19:15:28
2 2018-04-29 13:15:00 00:52:03 2018-04-29 14:07:03
3 2018-04-29 13:15:00 01:03:42 2018-04-29 14:18:42
4 2018-04-29 13:15:00 00:10:43 2018-04-29 13:25:43
如果在输出中需要 4 个单独的列,则另一种解决方案 - 仅将第一列转换为日期时间,将另一个转换为timedelta
s:
df = pd.read_csv('Datetimetest.csv', parse_dates=[0])
m = df['time'].str.count(':') != 1
df['time'] = pd.to_timedelta('00:' + df['time'].mask(m, df['time'].str.replace(':00$', '')))
df['kickoffTime'] = pd.to_timedelta(df['kickoffTime'])
df['eventdatetime'] = df['kickoffDate'] + df['kickoffTime'] + df['time']
print (df.head())
kickoffDate kickoffTime time eventdatetime
0 2018-04-30 19:00:00 00:47:36 2018-04-30 19:47:36
1 2018-04-30 19:00:00 00:15:28 2018-04-30 19:15:28
2 2018-04-29 13:15:00 00:52:03 2018-04-29 14:07:03
3 2018-04-29 13:15:00 01:03:42 2018-04-29 14:18:42
4 2018-04-29 13:15:00 00:10:43 2018-04-29 13:25:43
编辑:
如果输入数据不是,为了将第一列转换为日期时间,csv
可以使用以下to_datetime
参数代替:parse_dates
read_csv
df = pd.read_csv('Datetimetest.csv')
m = df['time'].str.count(':') != 1
df['time'] = pd.to_timedelta('00:' + df['time'].mask(m, df['time'].str.replace(':00$', '')))
df['kickoffDate'] = pd.to_datetime(df['kickoffDate'])
df['kickoffTime'] = pd.to_timedelta(df['kickoffTime'])
df['eventdatetime'] = df['kickoffDate'] + df['kickoffTime'] + df['time']
print (df.head())
kickoffDate kickoffTime time eventdatetime
0 2018-04-30 19:00:00 00:47:36 2018-04-30 19:47:36
1 2018-04-30 19:00:00 00:15:28 2018-04-30 19:15:28
2 2018-04-29 13:15:00 00:52:03 2018-04-29 14:07:03
3 2018-04-29 13:15:00 01:03:42 2018-04-29 14:18:42
4 2018-04-29 13:15:00 00:10:43 2018-04-29 13:25:43