我有一个csv文件,其中包含一列数据,其中每个值都是一个整数,表示一天中的小时和分钟。问题是每个值的格式不同。如果在12:00 AM和12:10 AM之间,则值仅为一位数字,即分钟。如果是在12:10 AM和1:00 AM之间,则值必须是数字,再次是分钟。如果在凌晨1:00到10:00之间,则该值将有三位数字,即小时和分钟。最后,对于所有其他值(上午10:00到12:00之间的值),该值将有四位数字,同样是小时和分钟。你知道吗
我试着用pandas的“tou datetime”函数来操作整个列。你知道吗
from pandas import read_csv, to_datetime
url = lambda year: f'ftp://sidads.colorado.edu/pub/DATASETS/NOAA/G00807/IIP_{year}IcebergSeason.csv'
df = read_csv(url(2011))
def convert_float_column_to_int_column(df, *column_names):
for column_name in column_names:
try:
df[column_name] = df[column_name].astype(int)
except ValueError:
df = df.dropna(subset=[column_name]).reset_index(drop=True)
df[column_name] = df[column_name].astype(int)
return df
df2 = convert_float_column_to_int_column(df, 'ICEBERG_NUMBER', 'SIGHTING_TIME')
df2['SIGHTING_TIME'] = to_datetime(df2['SIGHTING_TIME'].astype(str), format='%H%M')
我得到的结果是:
ValueError: time data '0' does not match format '%H%M' (match).
正如所料。你知道吗
我确信我可以通过遍历每一行,使用if语句,并将每个值转换为一个四个字符的字符串来解决这个问题,但是这些文件相对较大,所以解决方案太慢。你知道吗
不需要if语句。
Series.str.zfill
将用正确的零数填充它,以获得正确的格式。然后使用pd.to_datetime
,减去1900-01-01,这是当这些字段都不存在时将使用的日期:输入数据
pd.to_datetime
pd.to_timedelta
也可以使用,但由于无法指定格式参数,因此需要事先清除所有内容:
相关问题 更多 >
编程相关推荐