如何有效地从格式为HHMM、HMM、MM和M的整数值列中提取小时和分钟?

2024-09-27 21:32:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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语句,并将每个值转换为一个四个字符的字符串来解决这个问题,但是这些文件相对较大,所以解决方案太慢。你知道吗


Tags: 文件csvtonamedfdatetimetimecolumn
1条回答
网友
1楼 · 发布于 2024-09-27 21:32:32

不需要if语句。Series.str.zfill将用正确的零数填充它,以获得正确的格式。然后使用pd.to_datetime,减去1900-01-01,这是当这些字段都不存在时将使用的日期:

输入数据

import pandas as pd
df = pd.DataFrame({'Time': [1, 12, 123, 1234]})
#   Time
#0     1
#1    12
#2   123
#3  1234

pd.to_datetime

df['Time'] = (pd.to_datetime(df.Time.astype(str).str.zfill(4), format='%H%M') 
              - pd.to_datetime('1900-01-01'))

#0   00:01:00
#1   00:12:00
#2   01:23:00
#3   12:34:00
#Name: Time, dtype: timedelta64[ns]

pd.to_timedelta

也可以使用,但由于无法指定格式参数,因此需要事先清除所有内容:

df['Time'] = df.Time.astype(str).str.zfill(4)

# Pandas .str methods are slow, use a list comprehension to speed it up
#df['Time'] = df.Time.str[0:2] + ':' + df.Time.str[2:4] + ':00'    
csize=2
df['Time'] = [':'.join(x[i:i+csize] for i in range(0, len(x), csize))+':00' for x in df.Time.values]

df['Time'] = pd.to_timedelta(df.Time)

#0   00:01:00
#1   00:12:00
#2   01:23:00
#3   12:34:00
#Name: Time, dtype: timedelta64[ns]

相关问题 更多 >

    热门问题