sql server中表示时间,当月份小于10时,前面的"0"怎么 不能显示?还有日也是那样?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql server中表示时间,当月份小于10时,前面的"0"怎么 不能显示?还有日也是那样?相关的知识,希望对你有一定的参考价值。
新手正在学习,望告知,谢谢!
谁说不能显示的?想知道楼主是怎么使用的?用个最简单的例子:
select getdate(),你看看到底有没有
我试过,是2008-02-19 17:19:46.500 参考技术A select convert(varchar,getdate(),120) 参考技术B select to_char(sysdate,'yyyymm') from dual 参考技术C 前面加fm
'fmDD Month YYYY'
Python Pandas:当日期小于 13 时,pandas.to_datetime() 正在切换日期和月份
【中文标题】Python Pandas:当日期小于 13 时,pandas.to_datetime() 正在切换日期和月份【英文标题】:Python Pandas : pandas.to_datetime() is switching day & month when day is less than 13 【发布时间】:2018-10-26 07:37:33 【问题描述】:我编写了一个读取多个文件的代码,但是在我的某些文件上,只要日期小于 13,日期时间就会交换日期和月份,并且从第 13 天或以上的任何一天(即 2011 年 6 月 13 日)仍然正确(日/月/年)。 我试图通过这样做来修复它,但它不起作用。
我的数据框如下所示: 实际日期时间为 12june2015 至 13june2015 当我将日期时间列作为字符串读取时,日期保持正确 dd/mm/yyyy
tmp p1 p2
11/06/2015 00:56:55.060 0 1
11/06/2015 04:16:38.060 0 1
12/06/2015 16:13:30.060 0 1
12/06/2015 21:24:03.060 0 1
13/06/2015 02:31:44.060 0 1
13/06/2015 02:37:49.060 0 1
但是当我将列的类型更改为 datetime 列时,它会为小于 13 的每一天交换我的日期和月份。
输出:
print(df)
tmp p1 p2
06/11/2015 00:56:55 0 1
06/11/2015 04:16:38 0 1
06/12/2015 16:13:30 0 1
06/12/2015 21:24:03 0 1
13/06/2015 02:31:44 0 1
13/06/2015 02:37:49 0 1
这是我的代码:
我遍历文件:
df = pd.read_csv(PATH+file, header = None,error_bad_lines=False , sep = '\t')
然后当我的代码完成读取我的所有文件时,我将它们连接起来,问题是我的 datetime 列需要是 datetime 类型,所以当我通过 pd_datetime() 更改它的类型时,它会在当天交换日期和月份小于 13。
转换我的日期时间列后日期正确(字符串类型)
print(tmp) # as a result I get 11.06.2015 12:56:05 (11june2015)
但是当我更改列类型时,我得到了这个:
tmp = pd.to_datetime(tmp, unit = "ns")
tmp = temps_absolu.apply(lambda x: x.replace(microsecond=0))
print(tmp) # I get 06-11-2016 12:56:05 (06november2015 its not the right date)
问题是:当日期小于 13 时,我应该使用或更改什么命令来停止日期和月份交换?
更新 此命令交换我专栏的所有日期和月份
tmp = pd.to_datetime(tmp, unit='s').dt.strftime('%#m/%#d/%Y %H:%M:%S')
所以为了只交换不正确的日期,我写了一个条件:
for t in tmp:
if (t.day < 13):
t = datetime(year=t.year, month=t.day, day=t.month, hour=t.hour, minute=t.minute, second = t.second)
但它也不起作用
【问题讨论】:
你有什么问题? 问题是:如何停止这种日月交换? 【参考方案1】:我遇到了同样的问题,日期和月份从 13 开始转换。这对我有用,基本上我通过带有条件的字符串类型重新排序日期并使用 to_datetime。
def calendario(fecha):
if fecha.day < 13:
dia_real = fecha.month
mes_real = fecha.day
if dia_real < 10:
dia_real = '0'+str(dia_real)
nfecha = str(dia_real) + str(mes_real) + str(fecha.year)
nfecha = pd.to_datetime(nfecha, format='%d%m%Y', errors='ignore')
else:
nfecha = fecha
return nfecha
df['Nueva_fecha']=df['Fecha'].apply(calendario)
预期的输出: enter image description here
【讨论】:
【参考方案2】:我遇到了同样的问题。在我的情况下,日期是索引列(称为“日期”)。上面提到的直接在索引列“日期”的数据帧上使用 to_datetime() 的解决方案对我不起作用。我必须先使用 read_csv() 而不将索引设置为“日期”,然后对其应用 to_datetime(),然后才将索引设置为“日期”。
df= pd.read_csv(file, parse_dates=True)
df.Date = pd.to_datetime(df.Date, dayfirst=True)
df = df.set_index('Date')
【讨论】:
【参考方案3】:好吧,我解决了我的问题,但是在一个消耗内存的方法中,我首先将我的 tmp 列拆分为日期和时间列,然后我将我的日期列重新拆分为日月和年,这样我就可以查找日期小于 13 并用对应的月份替换它们
df['tmp'] = pd.to_datetime(df['tmp'], unit='ns')
df['tmp'] = df['tmp'].apply(lambda x: x.replace(microsecond=0))
df['date'] = [d.date() for d in df['tmp']]
df['time'] = [d.time() for d in df['tmp']]
df[['year','month','day']] = df['date'].apply(lambda x: pd.Series(x.strftime("%Y-%m-%d").split("-")))
df['day'] = pd.to_numeric(df['day'], errors='coerce')
df['month'] = pd.to_numeric(df['month'], errors='coerce')
df['year'] = pd.to_numeric(df['year'], errors='coerce')
#Loop to look for days less than 13 and then swap the day and month
for index, d in enumerate(df['day']):
if(d <13):
df.loc[index,'day'],df.loc[index,'month']=df.loc[index,'month'],df.loc[index,'day']
# 将系列转换为字符串类型以便合并它们
df['day'] = df['day'].astype(str)
df['month'] = df['month'].astype(str)
df['year'] = df['year'].astype(str)
df['date']= pd.to_datetime(df[['year', 'month', 'day']])
df['date'] = df['date'].astype(str)
df['time'] = df['time'].astype(str)
#在我们的列中合并时间和日期和地点结果
df['tmp'] =pd.to_datetime(df['date']+ ' '+df['time'])
# 删除添加的列
df.drop(df[['date','year', 'month', 'day','time']], axis=1, inplace = True)
【讨论】:
这很好用。非常感谢您的宝贵时间! 循环时,pandas 库中的 KeyError 905 不断出现。你知道如何解决这个问题吗?提前致谢【参考方案4】:您可以在pd.to_datetime
中使用dayfirst
参数。
pd.to_datetime(df.tmp, dayfirst=True)
输出:
0 2015-06-11 00:56:55
1 2015-06-11 04:16:38
2 2015-06-12 16:13:30
3 2015-06-12 21:24:03
4 2015-06-13 02:31:44
5 2015-06-13 02:37:49
Name: tmp, dtype: datetime64[ns]
【讨论】:
为什么这不是公认的答案?效果很好,谢谢! @DionysosDaVinci 谢谢。也许原始海报与此处记录的内容存在不同的问题。 如果指定了日期格式,会一直报错吗? @MiguelGonzalez 不,如果您使用 %d/%m/%Y 的确切格式,它不应该是 Miguel。不会出现 flopping 的错误。 完美,非常感谢@Scott Boston以上是关于sql server中表示时间,当月份小于10时,前面的"0"怎么 不能显示?还有日也是那样?的主要内容,如果未能解决你的问题,请参考以下文章