Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在转换为datetime的列上使用timedelta和strftime_Python_Excel_Pandas_Datetime - Fatal编程技术网

Python 在转换为datetime的列上使用timedelta和strftime

Python 在转换为datetime的列上使用timedelta和strftime,python,excel,pandas,datetime,Python,Excel,Pandas,Datetime,目标:将*.csv读取到数据帧后,我想将出生日期列转换为以下格式:%m-%d-%Y。然后将它们写入excel。*.csv有超过600K条记录 总结:我有20世纪和21世纪的日期,年份有时重叠。例如,从1901年到2001年,我可以有四位数的年份。由于这个原因,我不得不使用从中借用的代码片段 我的尝试和期望: 我最初将列转换为datetime,并使用了strftime(“%m-%d-%Y”)。但是,1970年及之前的年份将被写为20--。例如,这里的2070年和2068年应该分别是1970年和19

目标:将*.csv读取到数据帧后,我想将出生日期列转换为以下格式:
%m-%d-%Y
。然后将它们写入excel。*.csv有超过600K条记录

总结:我有20世纪和21世纪的日期,年份有时重叠。例如,从1901年到2001年,我可以有四位数的年份。由于这个原因,我不得不使用从中借用的代码片段

我的尝试和期望: 我最初将列转换为datetime,并使用了
strftime(“%m-%d-%Y”)
。但是,1970年及之前的年份将被写为20--。例如,这里的2070年和2068年应该分别是1970年和1968年。如果重要的话,生日列是
dtype
object

将熊猫作为pd导入
从日期时间导入时间增量
从日期时间导入日期时间
#生日栏
出生日期='患者出生日期'
#将*.csv读取到数据帧后,将出生日期列转换为%m-%d-%Y格式
df[birthdate]=pd.to_datetime(df[birthdate]).dt.strftime(“%m-%d-%Y”)
#印刷品
0    08-24-1996
1    10-16-1971
2    02-19-2070
3    09-25-2068
所以,我用上面提到的代码片段修复了这个问题。但是,现在我似乎无法从写入Excel的日期中删除时间。如果我打印到终端,我没有时间,但当我写Excel时,我有时间。看起来是这样的:
1996-08-24 00:00:00

df[birthdate]=pd.to_datetime(df[birthdate])
future=df[birthdate]>datetime.today()
df.loc[未来,出生日期]-=时间增量(天=365.25*100)

如果我在这里使用
df[birthdate]=pd.to_datetime(df[birthdate]).dt.strftime(“%m-%d-%Y”)
,我会得到一个错误:
TypeError:“>”在“str”和“datetime.datetime”实例之间不受支持。
Excel正在格式化它,但您可以在写入工作簿时更新该选择

您可以使用xlsxwriter引擎指定给定列的格式

这里还有一个关于使用xlsxwriter格式化日期的指南,但我根据下面的推断提供了一个解决方案

这仅在列为datetime格式时有效,因此可能需要使用此代码段验证

df['date1'] = df['date1'].dt.strftime('%m-%d-%Y')

然后运行以下命令,注意应用格式的列将根据dataframe中具有datetimes的列进行更改

df.to_excel(writer, sheet_name='Sheet1')

writer = pd.ExcelWriter("output.xlsx", engine='xlsxwriter')

# Get the xlsxwriter workbook and worksheet objects.
workbook  = writer.book
worksheet = writer.sheets['Sheet1']
# %m-%d-%Y
format = workbook.add_format({'num_format': 'mm-dd-yyyy'})

# Set the column width and format.
worksheet.set_column('B:B', 18, format)

writer.save()

我建议增加一点,以弥补100年来的损失

import pandas as pd

birthdate = 'PATIENT_BIRTH_DATE'
df = pd.DataFrame({birthdate: pd.to_datetime(["08-24-1996", "10-16-1971", "02-19-2070", "09-25-2068"])})

df.loc[df[birthdate] > pd.Timestamp('now'), birthdate] -= pd.tseries.offsets.DateOffset(years=100)

df
  PATIENT_BIRTH_DATE
0         1996-08-24
1         1971-10-16
2         1970-02-19
3         1968-09-25
而不是使用每年的平均天数



+1对于“永远不要使用两位数年份”bucket。

澄清一下:基本上,您的问题是您的数据源(csv)中有两位数年份?@MrFuppes这很混乱。例如,*.csv中的公式栏显示6/7/1943。但字段值显示7-Jun-43。所以,我不知道如何准确地回答你的问题。但是你有csv格式的数据吗?还是xls(x)文件如果是csv,您可以在文本编辑器中打开它(例如,在Windows上很好),然后检查“真实”格式,而不是Excel告诉您的格式。Excel喜欢为您思考,这并不总是聪明的^^^是的,源文件是*.csv格式。我用记事本++打开了它,日期显示为43年6月7日。你到底想说什么?那不是故意的。我只是想知道2位数的年份将走向何方。我使用:
df[birthdate]=pd.将列转换为datetime(df[birthdate],errors='concurve')
。然后我使用了您的
df['date1']=df['date1'].dt.strftime(“%m-%d-%Y”)
。但是,我仍然无法通过
TypeError:'>'str'和'Timestamp'实例之间不支持'>',这是指这一行:
df.loc[df[birthdate]>pd.Timestamp('now'),birthdate]=pd.tseries.offset.DateOffset(yeares=100)
。因此它听起来像
df.loc[df[birthdate]>pd.Timestamp('now'),birthdate]-=pd.tseries.offset.DateOffset(years=100)
导致错误。在您完成抵销过程之后,我将执行
df['date1']=df['date1'].dt.strftime(“%m-%d-%Y”)
的转换。