使用熊猫中的日期 - 删除日期时间中看不见的字符并转换为字符串

Rya*_*yan 3 python datetime timestamp date pandas

我正在使用pandas导入数据 dfST = read_csv( ... , parse_dates={'timestamp':[date]}) 在我的csv中,日期格式为YYY/MM/DD,这就是我所需要的 - 没有时间.我有几个数据集,我需要比较成员资格.当我将这些'timestamp'转换为字符串时,有时我得到这样的东西:

'1977-07-31T00:00:00.000000000Z'
Run Code Online (Sandbox Code Playgroud)

我理解的是一个日期时间,包括毫秒和时区.有没有办法抑制在导入时增加无关的时间?如果没有,我需要以某种方式排除它.

dfST.timestamp[1]
Out[138]: Timestamp('1977-07-31 00:00:00')
Run Code Online (Sandbox Code Playgroud)

我试过格式化它,这似乎工作,直到我调用格式化的值:

dfSTdate=pd.to_datetime(dfST.timestamp, format="%Y-%m-%d")  
dfSTdate.head()
Out[123]: 
0   1977-07-31
1   1977-07-31
Name: timestamp, dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)

但是没有...当我测试它的价值时我也得到时间:

dfSTdate[1]
Out[124]: Timestamp('1977-07-31 00:00:00')
Run Code Online (Sandbox Code Playgroud)

当我将其转换为数组时,时间包含在毫秒和时区中,这真的会让我的比较变得混乱.

test97=np.array(dfSTdate)
test97[1]
Out[136]: numpy.datetime64('1977-07-30T20:00:00.000000000-0400')
Run Code Online (Sandbox Code Playgroud)

我该怎样摆脱时间?!?最后,我希望比较数据集中的成员资格,使用numpy.in1d日期作为字符串('YYYY-MM-DD')作为比较的一部分

jor*_*ris 6

这是由于datetime值存储在pandas中的方式:使用numpy datetime64[ns]dtype.因此,datetime值始终以纳秒分辨率存储.即使您只有一个日期,也会将其转换为零时间纳秒分辨率的时间戳.这只是由于大熊猫的实施.

打印值并产生意外结果的问题只是因为这些对象在python控制台(它们的表示)中的打印方式,而不是它们的实际值.
如果您打印单个值,您将获得Timestamppandas 的表示:

Timestamp('1977-07-31 00:00:00')
Run Code Online (Sandbox Code Playgroud)

所以你也可以在这里获得秒数,因为这是默认表示.
如果将其转换为数组,然后打印它,您将获得标准的numpy表示:

numpy.datetime64('1977-07-30T20:00:00.000000000-0400')
Run Code Online (Sandbox Code Playgroud)

这确实是一种非常误导的表现形式.因为numpy仅用于在控制台中打印它,将其转换为您当地的时区.但这并没有改变你的实际价值,只是奇怪的印刷.


那是背景,现在回答你的问题,我该如何摆脱时间?
这取决于你的目标.你真的想把它转换成字符串吗?或者你只是不喜欢repr?

  • 如果您只想使用日期时间值,则无需删除它.

  • 如果要将其转换为字符串,可以应用strfitme(df['timestamp'].apply(lambda x: x.strftime('%Y-%m-%d'))).或者如果要将其作为字符串写入csv,请使用date_format关键字into_csv

  • 如果你真的想要'日期',你可以datetime.date在DataFrame列中使用类型(标准python类型).您可以将现有列转换为这一带:pd.DatetimeIndex(dfST['timestamp']).date.但我个人认为这没有多大优势.